刚入职新公司,接到的第一个需求就是把项目的log4j 1.x 升级到2.x。之前没有做过日志配置,都是直接拿来用的,这是第一次自己配置日志文件,所以记录下相关知识点。
1、排除1.0的jar包
首先排查项目中log的版本,把1.0相关的版本都要排除掉(这里推荐一个idea的插件,Maven Helper 辅助我们分析jar的依赖关系,对于解决jar冲突有很大的帮助)
通过插件找到了log4j目前的版本1.2.17,我们选中右键跳转到jar包的依赖树,再一次选中右键点击Exclude,排除掉jar包。
2、引入2.0的jar包
这里我使用的是springboot 自带的log4j2的jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
一般starter的版本号都会在当前项目使用的springboot的dependencies里面有默认版本配置
如果说我们想自定义log4j2的版本号,我们可以在pom文件里面直接制定版本号
<log4j2.version>2.15.0</log4j2.version>
如下:
这样我们就能发现我们项目引入的log4j2的版本都变成了2.15.0,这也是前些日子解决log4j漏洞最简单的办法
3、配置log4j2.xml
一般的log4j2.xml都在resources目录下面。如果想自己指定目录,需要在配置文件中使用logging.config:来指定目录
可以看下xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" Strict="true" name="XMLConfigTest">
<Properties>
<Property name="filepath">../logs</Property>
<Property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} %X{logger_id} %5p %c{1}:%M:%L - %msg%n</Property>
<Property name="log_count">14</Property>
</Properties>
<!-- 先定义所有的appender -->
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="${log_pattern}" />
</Console>
<RollingRandomAccessFile name="RollingRandomAccessFileInfo"
fileName="${filepath}/info.log"
filePattern="${filepath}/info.log.%d{yyyy-MM-dd}">
<Filters>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${log_pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认同一文件夹下最多保存7个文件-->
<DefaultRolloverStrategy max="${log_count}"/>
</RollingRandomAccessFile>
<RollingRandomAccessFile name="RollingRandomAccessFileError"
fileName="${filepath}/error.log"
filePattern="${filepath}/error.log.%d{yyyy-MM-dd}">
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${log_pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认同一文件夹下最多保存7个文件-->
<DefaultRolloverStrategy max="${log_count}"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<AsyncRoot level="INFO" includeLocation="true" additivity="false">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingRandomAccessFileInfo" />
<AppenderRef ref="RollingRandomAccessFileError" />
</AsyncRoot>
</Loggers>
</Configuration>
4、xml配置项解析
1. monitorInterval,配置的为120,单位为秒。即在服务运行过程中发生了log4j2配置文件的修改,log4j2能够在monitorInterval时间范围重新加载配置,无需重启应用。
2. property配置文件全局属性的声明,使用方式为:${声明的属性名称}。
3. RollingRandomAccessFile基本属性
name:Appender名称
immediateFlush:log4j2接收到日志事件时,是否立即将日志刷到磁盘。默认为true。
fileName:日志存储路径
filePattern:历史日志封存路径。其中%d{yyyyMMddHH}表示了封存历史日志的时间单位(目前单位为小时,yyyy表示年,MM表示月,dd表示天,HH表示小时,mm表示分钟,ss表示秒,SS表示毫秒)
4. TimeBasedTriggeringPolicy
interval:表示历史日志封存间隔时间,单位为filePattern设置的单位值
5. ThresholdFilter
level,表示最低接受的日志级别,博客配置的为INFO,打印INFO级别以上的日志。