log4j接连爆了两个严重BUG,导致线上项目接到通知要统一升级到最新的log4j 版本
目标版本 <slf4j.version>1.7.5</slf4j.version>
<log4j.version>2.17.1</log4j.version>
统一设置版本上面是要升级的版本号,下面是我的配置
<!--slf4j的依赖-->
<!-- <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency> -->
<!-- <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency> -->
<!--log4j2 的依赖-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<!--用于与sfl4j保持桥接-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- 用来无缝切换Log4j到log4j2的中间层 注意版本号要跟用的log4j2的版本号一致 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>${log4j.version}</version>
</dependency>
第一步:确保你的项目本地maven编译打包正常,项目tomcat启动或其他启动容器运行正常,
简单说就是你要先项目本地能跑起来
第二步:解决包冲突,你需要统一你pom文件内所有包的版本,有冲突的全部解决,两个版本的保留大版本如图,打开pom选中右边的包,一个一个往下看左边出现冲突。
使用exclusions排除包内部的不同版本,统一使用最外层pom配置版本
排除版本技巧:右键选择左边的冲突包名》选择open pom找到pom配置的groupid+artifactid复制填入外层的引用包exclusion内然后保存刷新看看是否还冲突。
第三步:删除log4j.properties配置,也可以保留备份,新增log4j2.xml 注释web.xml中log4j的配置原始的log4j.properties 配置可以移植到log4j2.xml 具体对照关系可以百度看配置属性基本是照搬过去的写法不一样而已:如图
log4j2.xml 的简单配置
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorinterval="180">
<properties>
<!-- 日志目录 -->
<property name="LOG_HOME">../logs/abc</property>
<!-- 日志级别ERROR、WARN、INFO、DEBUG -->
<property name="LOG_LEVEL">INFO</property>
</properties>
<Appenders>
<!-- 控制台输出 如需要控制台输出有颜色区别请在虚拟机启动项参数添加 -Dlog4j.skipJansi=false -->
<Console name="Console" target="SYSTEM_OUT">
<!-- <PatternLayout pattern="%d{HH:mm:ss.SSS} %file %highlight{%-5level} %L {bright,blue} - %msg%n"/> -->
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%5p][%t][%c{1}]-[%M][%L] %m%n"/>
</Console>
<!-- 按文件保存日志文件 -->
<!-- 按小时生成日志文件 -->
<!-- filePath = "${LOG_HOME}/DMAPro-%d{yyyy-MM-dd-HH-mm}.log"-->
<!-- 按天生成日志文件 -->
<!-- filePattern="${LOG_HOME}/DMAPro-%d{yyyy-MM-dd}.log"-->
<!-- 按月生成日志文件 -->
<!-- filePattern="${LOG_HOME}/DMAPro-%d{yyyy-MM}.log"-->
<RollingRandomAccessFile name="LogFile" fileName="${LOG_HOME}/abc.log"
filePattern="${LOG_HOME}/abc-%d{yyyy-MM-dd}.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %file %-5level [%t] %logger{36} %L %M - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<!-- 保留20天日志 -->
<DefaultRolloverStrategy max="20"/>
</RollingRandomAccessFile>
<!-- 用于捕捉错误时使用 -->
<appender name="detailedError" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${LOG_HOME}/errorDetailed.log" />
<!-- 每小时1个文件 -->
<param name="DatePattern" value="'.'yyyy-MM-dd-HH'.log'" />
<!-- 最大文件的size,单位:Kb,Mb... -->
<param name="MaxFileSize" value="4096" />
<!-- 重启了服务器之后,是否在原有文件的后面追加?true(默认):追加;false:不追加 -->
<param name="Append" value="true"/>
<!-- 默认 MaxBackupIndex 为 1 -->
<param name="MaxBackupIndex" value="10" />
<param name="Encoding" value="utf-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%5p] %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="WARN" />
</filter>
</appender>
</Appenders>
<Loggers>
<!-- com.iwatermgr.ishuidi输出该目录下日志级别info -->
<!-- 如需要对某个目录下日志进行调试请具体调试 -->
<Logger name="com.abc" level="${LOG_LEVEL}"></Logger>
<Root level="${LOG_LEVEL}">
<AppenderRef ref="Console"/>
<AppenderRef ref="LogFile"/>
</Root>
</Loggers>
</Configuration>
第四步:以上步骤昨完就算升级完成了,接下来需要验证包的日志输出和打包后tomcat的启动情况
验证本地启动:本地启动日志输出正常OK
maven打包编译:编译打包OK
部署到tomcat:单独tomcat启动OK日志输出正常OK
第五步:补充说明
升级过程中遇到两个方面的问题
错误:Feature 'http://apache.org/xml/features/xinclude' is not recognized.
这个错误百度说是由于xercesImpl的jar使用了默认的xml解析规则导致log4j2无法解析出现的,因为之前是log4j.properties现在换成了xml模式他就会报错。百度有好几种处理方案,我是直接删除,因为我pom本身没配置找很久找不到是那个地方引用进来的。最后没办法手动删除。
错误:pom配置了新的logj4j版本jar可是打包就会多出来两个老的版本log4j包,
如图:确认过pom中没有,打包部署就会有这两个出来,最后没办法手动删除了事