Log4j2简介
有关日志框架slf4j、j.u.l、log4j、logback、log4j2 的比较以及log4j2 配置文件的详细说明,请参阅上一篇文章《Log4j2使用详解》。
Log4j2实例
让我们通过一个示例来了解一下使用Spring Boot 的Log4j2 应用程序。
1.引入log4j2依赖
Spring Boot 默认使用LogBack。如果使用Log4j2,则必须从spring-boot-starter-web中删除spring-boot-starter-logging依赖,并显式声明Log4j2依赖jar包,如下:
依赖groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactIdExclusions!–删除默认配置–exclusiongroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-logging/artifactId/exclusion/exclusions/dependency! –log4j2 引入依赖–dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-log4j2/artifactId/dependency2,创建并配置log4j2-spring.xml。
在src/main/resources文件夹下创建log4j2-spring.xml文件,写入以下内容:
?xml version=\’1.0\’ Encoding=\’UTF-8\’?配置属性Property name=\’logBase\’~//property /properties Appender Console name=\’Console\’ Target=\’SYSTEM_OUT\’ PatternLayout charset=\’UTF-8\’ Pattern=\'[%d][%-5p][%t][%c]-%m%n\’ //控制台RollingFile name=\’RollingFile\’ fileName=\’${logBase}/logs/access.log\’ filePattern=\’${logBase}/logs/access.%d{yyyy-MM-dd}.log\’ PatternLayout 模式=\'[%d] [%-5p] [%t] [%c] – %m%n\’/TimeBasedTriggeringPolicy//RollingFile RollingFile name=\’ErrorFile\’ fileName=\’${logBase}/logs/error.log\’ filePattern=\’${logBase}/logs/error.%d{yyyy-MM-dd}.log\’ 过滤器ThresholdFilter level=\’error\’ onMatch=\’ACCEPT\’ onMismatch=\’DENY\’ //Filters PatternLayout pattern=\'[%d] [error] [%t] [%c] – %m%n\’/TimeBasedTriggeringPolicy//RollingFile /Appenders Logger root level=\’trace\’ AppenderRef ref=\’Console\’/AppenderRef ref=\’RollingFile\’/AppenderRef ref=\’ErrorFile\’//Root /Loggers/configuration 有关每个节点的详细说明,请参阅《Log4j2使用详解》。
根据您项目的实际日志目录更改logBase。
3.打印日志
通常,您可以使用LoggerFactory 来获取Logger 对象并将以下内容添加到您的BlogController。
private Final static Logger logger=LoggerFactory.getLogger(BlogController.class);@GetMapping(value=\’log\’)public String printLog() { logger.trace(\’跟踪日志\’); logger.warn(\’警告日志\’); logger.error(\’错误日志\’); 调用该接口时,您将看到控制台和日志目录。日志/access.log文件按照跟踪日志到错误日志的顺序输出,错误日志输出到error.log。
如果在log4j2-spring.xml文件中将Root level=\’trace\”更改为Root level=\’info\”,则日志将从info级别输出,而不会输出trace和debug日志。
多环境配置日志文件
Spring Boot 默认加载log4j2-spring.xml 文件。如果配置application.yml配置文件以及application.yml配置文件,则必须针对不同的环境配置不同的log4j2文件。不同目录输出到控制台、测试环境、线上日志等。此时,您还可以根据自己的环境配置不同的日志文件。
1. 创建log4j2-dev.xml、log4j2-test.xml、log4j2-prod.xml。
log4j2-dev.xml:将log4j2-spring.xml文件的内容复制到log4j2-dev.xml。
log4j2-test.xml:删除控制台打印,更改logBase 变量,更改根日志级别。
?xml 版本=\’1.0\’ 编码=\’UTF-8\’ ?配置属性属性名称=\’logBase\’~/test//property /properties Appenders RollingFile name=\’RollingFile\’ fileName=\’${logBase}/logs/access. log\’ filePattern=\’${logBase}/logs/access.%d{yyyy-MM-dd}.log\’ PatternLayout 模式=\'[%d] [%-5p] [%t] [%c] – %m %n\’/TimeBasedTriggeringPolicy//RollingFile RollingFile name=\’ErrorFile\’ fileName=\’${logBase}/logs/error.log\’ filePattern=\’${logBase}/logs/error.%d{yyyy-MM-dd}。 log\’Filter ThresholdFilter level=\’error\’ onMatch=\’ACCEPT\’ onMismatch=\’DENY\’ //Filters PatternLayout pattern=\'[%d] [error] [%t] [%c] – %m%n\’/TimeBasedTriggeringPolicy//RollingFile /Appenders Loggers Root level=\’info\’ AppenderRef ref=\’RollingFile\’/AppenderRef ref=\’ErrorFile\’//Root /Loggers/configurationlog4j2-prod.xml:将logBase 变量更改为~/prod/。其他与log4j2-test.xml相同
2.删除log4j2-spring.xml
3. 多个配置日志文件
将配置节点添加到application-dev.yml。
添加logging: config: classpath:log4j2-dev.xmlapplication-test.yml配置节点。
添加logging: config: classpath:log4j2-test.xmlapplication-prod.yml配置节点。
logging: config: classpath:log4j2-prod.xml4、更改环境变量并查看日志输出结果。
IDEA 允许您通过更改活动配置文件在开发、测试和生产环境之间切换,从而允许您查看不同环境的日志输出。
使用traceId跟踪请求全流程日志
在线,我一般采用多机部署,使用kibana进行日志收集。然而,当并发较高时,使用日志来识别问题可能会很繁琐,并且很难过滤掉与给定请求相关的所有日志。因此,您可以修改日志输出,使用traceId来跟踪请求的整个路径。
1.MDC概述
MDC:映射诊断上下文、映射调试上下文。这是log4j和logback提供的一个功能,方便多线程情况下进行日志记录。 MDC 中包含的内容可以由同一线程上运行的代码访问。当前线程的子线程继承父线程的MDC的内容。如果需要日志记录,只需从MDC 获取所需的信息即可。
2.创建一个AccessInterceptor
在com.tn666.demo目录下创建一个Interceptor文件夹,并在该文件夹下创建一个AccessInterceptor类文件。
public class AccessInterceptor Implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception { String traceId=UUID.randomUUID().toString() return true; 一旦发起请求,就会写入一个preHandle 方法;到MDC。本节主要介绍traceId记录。稍后我们将更详细地讨论拦截器。文章。
3. 创建MvcConfiguration
在com.tn666.demo.configuration 文件夹中创建MvcConfiguration 类文件。
@Configurationpublic class MvcConfigurationimplements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistryregistry) {registry.addInterceptor(new AccessInterceptor()) }} 4. 读取跟踪ID。
log4j和logback的取值方法是:
%X{traceId} 将traceId 读取添加到日志文件的PatternLayout。
PatternLayoutpattern=\'[%d][%X{traceId}][%-5p][%t][%c]-%m%n\’/5,日志输出
当您访问该界面时,您将看到traceId的输出。
从输出日志中可以看到,这是两个具有两个TraceId 的http 请求。
6.下游服务使用相同的traceId
在查找问题时,您可能希望将请求捆绑在一起,例如调用第三方服务。在这种情况下,您可以使用以下方法:
1)转换http调用工具
当您发送http 请求时,traceId 会自动添加到标头中。
2)更改下游服务的拦截器
下游服务的拦截器首先从header 中获取TraceId 并将其写入MDC。如果标头中没有TraceId,则使用UUID。
文章中的示例代码可以在https://github.com/tunan66666/spring-boot-demo找到。
如果觉得还可以请点个赞,谢谢,您的支持是我最大的动力
原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/83806.html