iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >全局记录Feign的请求和响应日志方式
  • 737
分享到

全局记录Feign的请求和响应日志方式

2024-04-02 19:04:59 737人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1、项目里定义FeignClient接口2、单个FeignClient接口开启日志3、所有FeignClient接口 开启日志3.1、修改FeignConfiguration3.

项目里使用了Feign进行远程调用,有时为了问题排查,需要开启请求和响应日志

下面简介一下如何开启Feign日志:

注:本文基于

  • spring-boot-starter-parent 2.3.4.RELEASE
  • spring-cloud-starter-openfeign 2.2.3.RELEASE

1、项目里定义FeignClient接口

package com.example.demo.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.WEB.bind.annotation.GetMapping;
@FeignClient(name = "deom", url = "https://www.baidu.com")
public interface FeignDemo {
    @GetMapping("/")
    String test();
}

2、单个FeignClient接口开启日志

在 application.yml 里指定Feign接口日志级别为DEBUG,类型为FULL:

注:com.example.demo.feign.FeignDemo就是上面定义的FeignClient接口

logging:
  level:
    com.example.demo.feign.FeignDemo: debug
# 下面的配置,也可以写代码代替
# @Bean
# public Logger.Level level() { return Logger.Level.FULL; }
feign:
  client:
    config:
      default:
        loggerLevel: full

OK了,重启项目,调用 FeignDemo.test() 方法后,会输出如下日志:

2020-10-13 11:46:24.161 DEBUG 20824 --- [NIO-8080-exec-4] com.example.demo.feign.FeignDemo         : [FeignDemo#test] ---> GET Https://www.baidu.com HTTP/1.1
2020-10-13 11:46:24.162 DEBUG 20824 --- [nio-8080-exec-4] com.example.demo.feign.FeignDemo         : [FeignDemo#test] ---> END HTTP (0-byte body)
2020-10-13 11:46:24.255 DEBUG 20824 --- [nio-8080-exec-4] com.example.demo.feign.FeignDemo         : [FeignDemo#test] <--- HTTP/1.1 200 OK (93ms)
2020-10-13 11:46:24.255 DEBUG 20824 --- [nio-8080-exec-4] com.example.demo.feign.FeignDemo         : [FeignDemo#test] content-length: 2443
2020-10-13 11:46:24.255 DEBUG 20824 --- [nio-8080-exec-4] com.example.demo.feign.FeignDemo         : [FeignDemo#test] content-type: text/html
2020-10-13 11:46:24.256 DEBUG 20824 --- [nio-8080-exec-4] com.example.demo.feign.FeignDemo         : [FeignDemo#test] date: Tue, 13 Oct 2020 03:46:24 GMT
2020-10-13 11:46:24.256 DEBUG 20824 --- [nio-8080-exec-4] com.example.demo.feign.FeignDemo         : [FeignDemo#test] server: bfe
2020-10-13 11:46:24.256 DEBUG 20824 --- [nio-8080-exec-4] com.example.demo.feign.FeignDemo         : [FeignDemo#test] 
2020-10-13 11:46:24.257 DEBUG 20824 --- [nio-8080-exec-4] com.example.demo.feign.FeignDemo         : [FeignDemo#test] <!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/CSS href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zGoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_fORM> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=/file/imgs/upload/202211/13/widgfhzw4b5.jpg?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3D1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="/file/imgs/upload/202211/13/widgfhzw4b5.jpg?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');
                </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

3、所有FeignClient接口 开启日志

上面的方法,只能开启单个FeignClient接口,如果项目里有10个接口,那么要在yml里配置10项,而且以后添加新的FeignClient,还要记得去修改yml配置,太麻烦。

所以,下面是开启所有FeignClient接口日志的配置:

3.1、修改FeignConfiguration

自定义feign.Logger,如下:

package com.example.demo.cacheDemo;
import feign.slf4j.Slf4jLogger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfiguration {
    @Bean
    public feign.Logger logger() {
        return new Slf4jLogger();
    }
}

3.2、还是修改 application.yml 配置

logging:
  level:
    # 删除具体的FeignClient接口配置,只保留这一个就好了
    feign.Logger: debug
# 也可以写代码代替
# @Bean
# public Logger.Level level() { return Logger.Level.FULL; }
feign:
  client:
    config:
      default:
        loggerLevel: full

3.3、OK了,此时项目里

不管新增多少个 FeignClient,都会输出日志。

4、重写FeignClient输出日志

根据上面输出的日志,可以看到是多条INFO日志,在并发时,很有可能会互相干扰,而且格式也无法调整。

我们知道,Feign默认情况下,是使用 feign.Client.Default 发起http请求;

我们可以重写Client,并注入Bean来替换掉 feign.Client.Default,从而实现日志记录,当然也可以做其它任意事情了,比如添加Header。下面是注入Bean的代码:

// 默认不注入,如果yml配置里有 logging.level.beinet.cn.demostudy.MyClient 才注入
@Bean
@ConditionalOnProperty("logging.level.beinet.cn.demostudy.MyClient")
MyClient getClient() throws NoSuchAlgorithmException, KeyManagementException {
    // 忽略SSL校验
    SSLContext ctx = SSLContext.getInstance("SSL");
    X509TrustManager tm = new X509TrustManager() {
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) {
        }
        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) {
        }
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    };
    ctx.init(null, new TrustManager[]{tm}, null);
    return new MyClient(ctx.getSocketFactory(), (hostname, sslSession) -> true);
}

下面是重写的Client完整代码:

package beinet.cn.demostudy;
import feign.Client;
import feign.Request;
import feign.Response;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StreamUtils;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;
import java.util.Collection;
import java.util.Map;
@Slf4j
public class MyClient extends Client.Default {
    public MyClient(SSLSocketFactory socketFactory, HostnameVerifier hostnameVerifier) {
        super(socketFactory, hostnameVerifier);
    }
    @Override
    public Response execute(Request request, Request.Options options) throws IOException {
        StringBuilder sb = new StringBuilder("[log started]\r\n");
        sb.append(request.httpMethod()).append(" ").append(request.url()).append("\r\n");
        CombineHeaders(sb, request.headers()); // 请求Header
        CombineBody(sb, request.body());
        long costTime = -1;
        Exception exception = null;
        BufferingFeignClientResponse response = null;
        long begin = System.currentTimeMillis();
        try {
            response = new BufferingFeignClientResponse(super.execute(request, options));
            costTime = (System.currentTimeMillis() - begin);
        } catch (Exception exp) {
            costTime = (System.currentTimeMillis() - begin);
            exception = exp;
            throw exp;
        } finally {
            sb.append("\r\nResponse cost time(ms): ").append(String.valueOf(costTime));
            if (response != null)
                sb.append("  status: ").append(response.status());
            sb.append("\r\n");
            if (response != null) {
                CombineHeaders(sb, response.headers()); // 响应Header
                sb.append("Body:\r\n").append(response.body()).append("\r\n");
            }
            if (exception != null) {
                sb.append("Exception:\r\n  ").append(exception.getMessage()).append("\r\n");
            }
            sb.append("\r\n[log ended]");
            log.debug(sb.toString());
        }
        Response ret = response.getResponse().toBuilder()
                .body(response.getBody(),
                        response.getResponse().body().length()).build();
        response.close();
        return ret;
    }
    private static void CombineHeaders(StringBuilder sb, Map<String, Collection<String>> headers) {
        if (headers != null && !headers.isEmpty()) {
            sb.append("Headers:\r\n");
            for (Map.Entry<String, Collection<String>> ob : headers.entrySet()) {
                for (String val : ob.getValue()) {
                    sb.append("  ").append(ob.geTKEy()).append(": ").append(val).append("\r\n");
                }
            }
        }
    }
    private static void CombineBody(StringBuilder sb, byte[] body) {
        if (body == null || body.length <= 0)
            return;
        sb.append("Body:\r\n").append(new String(body)).append("\r\n");
    }
    static final class BufferingFeignClientResponse implements Closeable {
        private Response response;
        private byte[] body;
        private BufferingFeignClientResponse(Response response) {
            this.response = response;
        }
        private Response getResponse() {
            return this.response;
        }
        private int status() {
            return this.response.status();
        }
        private Map<String, Collection<String>> headers() {
            return this.response.headers();
        }
        private String body() throws IOException {
            StringBuilder sb = new StringBuilder();
            try (InputStreamReader reader = new InputStreamReader(getBody())) {
                char[] tmp = new char[1024];
                int len;
                while ((len = reader.read(tmp, 0, tmp.length)) != -1) {
                    sb.append(new String(tmp, 0, len));
                }
            }
            return sb.toString();
        }
        private InputStream getBody() throws IOException {
            if (this.body == null) {
                this.body = StreamUtils.copyToByteArray(this.response.body().asInputStream());
            }
            return new ByteArrayInputStream(this.body);
        }
        @Override
        public void close() {
            this.response.close();
        }
    }
}

输出日志示例:

2020-10-15 16:48:26.081 DEBUG 15664 --- [           main] beinet.cn.demostudy.MyClient             : [log started]
POST https://www.baidu.com?flg=3
Headers:
  Content-Length: 14
  Content-Type: text/plain;charset=UTF-8
Body:
abcde我是DDD

Response cost time(ms): 207  status: 200
Headers:
  content-length: 2443
  content-type: text/html
  date: Thu, 15 Oct 2020 08:48:27 GMT
  server: bfe
Body:
<!DOCTYPE html>百度的html</html>

5、使用Aspect切面输出日志

这个不推荐,因为它无法打印出具体的url、header等数据,大家可以参考:

不需要yml配置,直接在项目里添加如下代码即可:

package com.example.demo.feign;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
@Aspect
@Component
@Slf4j
public class FeignAspect {
    // 这个也行 @Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping)")
    // 参考 https://GitHub.com/spring-cloud/spring-cloud-openfeign/issues/322
    @Pointcut("@within(org.springframework.cloud.openfeign.FeignClient)")
    public void feignClientPointcut() {
    }
    @Around("feignClientPointcut()")
    public Object feignAround(ProceedingJoinPoint joinPoint) throws Throwable {
        return logAround(joinPoint);
    }
    private static ObjectMapper mapper = new ObjectMapper();
    private Object logAround(ProceedingJoinPoint point) throws Throwable {
        long beginTime = System.currentTimeMillis();
        Object result = null;
        Exception exception = null;
        try {
            result = point.proceed();
        } catch (Exception exp) {
            exception = exp;
        }
        long time = System.currentTimeMillis() - beginTime;
        saveLog(point, result, exception, time);
        if (exception != null) {
            throw exception;
        }
        return result;
    }
    private static void saveLog(ProceedingJoinPoint joinPoint, Object result, Exception exception, long time) {
        Dto dto = new Dto();
        dto.setCostTime(time);
        try {
            if (exception != null) {
                dto.setExp(exception.toString());
            }
            if (result != null) {
                dto.setResult(serial(result));
            }
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            //请求的 类名、方法名
            String className = joinPoint.getTarget().getClass().getName();
            String signName = signature.getDeclaringTypeName();
            if (!signName.equalsIgnoreCase(className))
                signName += "|" + className;
            dto.setClas(signName);
            String methodName = signature.getName();
            dto.setMethod(methodName);
            //请求的参数
            Object[] args = joinPoint.getArgs();
            if (args != null && args.length > 0) {
                dto.setPara(serial(args));
            }
        } catch (Exception e) {
            dto.setExp(e.toString());
        }
        if (exception != null) {
            log.warn(dto.toString());
        } else {
            log.info(dto.toString());
        }
    }
    private static String serial(Object obj) {
        try {
            return mapper.writeValueAsString(obj);
        } catch (Exception ex) {
            return obj.toString();
        }
    }
    @Data
    private static class Dto {
        
        private String clas;
        
        private String method;
        
        private String para;
        
        private String result;
        
        private long costTime;
        
        private String remark;
        
        private String exp;
    }
}

OK,输出的日志如下:

2020-10-13 14:24:48.321  INFO 21304 --- [nio-8080-exec-3] com.example.demo.feign.FeignAspect       : FeignAspect.Dto(clas=com.example.demo.feign.FeignDemo|com.sun.proxy.$Proxy72, method=test, para=null, result="<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class=\"bg s_ipt_wr\"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class=\"bg s_btn_wr\"><input type=submit id=su value=百度一下 class=\"bg s_btn\" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=/file/imgs/upload/202211/13/widgfhzw4b5.jpg?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href=\"/file/imgs/upload/202211/13/widgfhzw4b5.jpg?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === \"\" ? \"?\" : \"&\")+ \"bdorz_come=1\")+ '\" name=\"tj_login\" class=\"lb\">登录</a>');\r\n                </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style=\"display: block;\">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

注:Feign官方文档:

https://cloud.spring.io/spring-cloud-openfeign/reference/html/

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 全局记录Feign的请求和响应日志方式

本文链接: https://www.lsjlt.com/news/151658.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 全局记录Feign的请求和响应日志方式
    目录1、项目里定义FeignClient接口2、单个FeignClient接口开启日志3、所有FeignClient接口 开启日志3.1、修改FeignConfiguration3....
    99+
    2024-04-02
  • Feign的请求和响应日志方式是什么
    这篇文章主要介绍了Feign的请求和响应日志方式是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Feign的请求和响应日志方式是什么文章都会有所收获,下面我们一起来看看吧。1、项目里定义FeignClien...
    99+
    2023-07-02
  • ASP 日志是如何记录响应的?
    ASP 日志是如何记录响应的? ASP(Active Server Pages)是一种常用的Web开发技术。在ASP应用程序中,ASP日志是非常重要的一部分,可以记录应用程序的运行情况和异常情况,以便开发人员及时发现和解决问题。本文将介绍A...
    99+
    2023-08-26
    日志 响应 教程
  • SpringCloud Gateway之请求应答日志打印方式
    目录Gateway请求应答日志打印第一步第二步Gateway全局请求日志打印把请求体的数据存入exchange编写全局日志拦截器代码在代码中配置全局拦截器Gateway请求应答日志打...
    99+
    2024-04-02
  • JavaScript 中如何拦截全局 Fetch API 的请求和响应问题
    目录JavaScript Fetch API实现拦截对 Fetch 使用猴子补丁(monkey patching)请求拦截器响应拦截器错误处理Node.js使用 fetch-inte...
    99+
    2023-01-06
    js拦截全局Fetch API js拦截全局 js拦截全局请求和响应
  • Java日志记录的新方式:使用Spring和Bash
    在Java应用程序中,日志记录是非常重要的一部分。它可以帮助我们追踪应用程序的行为、问题和异常情况。传统的日志记录方式是通过Java自带的log4j、logback等框架进行记录,但是这些框架的日志记录方式有时候会比较繁琐和复杂。本文将介...
    99+
    2023-06-21
    日志 spring bash
  • HTTP 请求和响应的全过程详解。
    HTTP(Hypertext Transfer Protocol)是在客户端和服务器之间传输数据的协议。在这篇文章中,我们将详细介绍 HTTP 请求和响应的全过程,包括请求的构成、传输过程、响应的构成以及状态码的含义。同时,为了更好地理解,...
    99+
    2023-08-31
    bash numy http
  • PHP和HTTP如何协同工作,并记录同步请求的日志?
    在Web开发中,PHP和HTTP是不可分割的。PHP是一种流行的服务器端编程语言,而HTTP是Web应用程序的基本协议。PHP和HTTP的协同工作非常重要,因为它们一起构成了一个完整的Web应用程序。在本文中,我们将学习如何使用PHP和H...
    99+
    2023-09-03
    同步 http 日志
  • PHP 函数在日志记录方面的应用
    php 日志记录函数:error_log():将消息记录到指定目标,如文件或系统日志。syslog():将消息记录到系统日志,并支持指定消息优先级。日志级别:php 支持多种日志级别,可...
    99+
    2024-04-15
    php 日志记录
  • Java和NPM:日志记录的新方法和技巧?
    随着软件系统的不断发展和更新,日志记录成为了一个越来越重要的组成部分。在软件开发的过程中,我们会不断地收集和分析日志,以便更好地理解系统运行过程中的问题和异常情况。然而,如何有效地记录日志并快速地找到问题是一个不断被优化和改进的过程。 在...
    99+
    2023-06-04
    npm 日志 重定向
  • 如何在Java应用程序中实现快速响应和高效的日志记录?
    在Java应用程序中实现快速响应和高效的日志记录是非常重要的。日志记录可以帮助我们了解应用程序的运行情况,以及对问题进行调试和排除故障。本文将介绍一些实现快速响应和高效的日志记录的最佳实践。 使用异步日志记录 在Java应用程序中,通常...
    99+
    2023-09-02
    缓存 日志 响应
  • Spring 应用程序中的 ASP 日志记录方法
    在开发 Spring 应用程序时,日志记录是非常重要的一部分。ASP(Aspect Oriented Programming,面向切面编程)是一种流行的编程范式,它可以帮助我们更好地管理和记录应用程序的日志信息。本文将介绍在 Spring...
    99+
    2023-09-11
    日志 windows spring
  • Java开发者必备技能:HTTP请求日志记录和缓存实现指南
    在进行Java Web开发时,我们经常需要处理HTTP请求。而HTTP请求的日志记录和缓存实现是Java开发者必备的技能之一。本文将为您介绍HTTP请求日志记录和缓存实现的指南,以帮助您更好地进行Java Web开发。 一、HTTP请求日...
    99+
    2023-07-24
    http 日志 缓存
  • gateway、webflux、reactor-netty请求日志输出的方式是什么
    本篇内容介绍了“gateway、webflux、reactor-netty请求日志输出的方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2023-06-29
  • 日志记录对Java应用程序的性能是否有影响?
    在开发Java应用程序时,我们通常都会使用日志记录来记录应用程序的运行情况。日志记录不仅可以帮助我们追踪应用程序的运行情况,还可以帮助我们进行故障排查和性能分析。但是,一些开发者担心日志记录会对应用程序的性能产生负面影响。那么,日志记录对...
    99+
    2023-09-02
    缓存 日志 响应
  • ASP网站的日志记录方式有哪些选择?
    在ASP网站开发过程中,日志记录是一个非常重要的环节。通过记录日志,我们可以监控网站的运行情况,及时排除问题,保障网站的稳定性和可靠性。那么,ASP网站的日志记录方式有哪些选择呢?本文将为您详细介绍ASP网站的日志记录方式。 使用Log...
    99+
    2023-08-20
    path 缓存 日志
  • 如何使用编程算法处理PHP应用程序的日志记录和响应时间?
    在开发PHP应用程序时,日志记录和响应时间是非常重要的。它们可以帮助我们识别应用程序中的问题和性能瓶颈。在本文中,我们将讨论如何使用编程算法处理PHP应用程序的日志记录和响应时间。 一、日志记录 在PHP应用程序中,我们可以使用PHP的内...
    99+
    2023-11-05
    日志 响应 编程算法
  • SpringBoot详解各类请求和响应的处理方法
    目录1. HttpServletRequest与HttpServletResponse2. GET类型的请求2.1 /studentscurrent=1&limit=202....
    99+
    2024-04-02
  • ASP 系统在 Windows 和 Unix 上的日志记录方式有何不同?
    ASP(Active Server Pages)系统是一种服务器端脚本技术,常用于创建动态网页和Web应用程序。ASP系统在Windows和Unix上都有广泛的应用,但是它们在日志记录方面有一些不同之处。 在Windows操作系统上,ASP...
    99+
    2023-08-16
    unix 日志 windows
  • Python 中的日志系统:如何记录和管理应用程序的运行日志?
    在开发应用程序时,我们经常需要记录应用程序的运行状态和错误信息,以便于日后排查问题。在 Python 中,可以使用标准库中的 logging 模块来实现日志记录和管理。 本文将介绍 Python 中的日志系统,包括如何创建和配置日志记录器...
    99+
    2023-10-08
    接口 path 日志
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作