因为新版本的log4j2日志性能更好,所以我们采用新版本的日志打印来提高系统性能,那么如何替换新版本的日志打印,下面是步骤:
步骤1:
修改log4j版本的依赖。
<log4j.version>2.10.0</log4j.version>
pom中添加依赖:
<!-- log start --> <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> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <!-- 桥接:告诉Slf4j使用Log4j2 --> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <!-- 桥接:告诉commons logging使用Log4j2 --> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jcl</artifactId> <version>${log4j.version}</version> </dependency> <!-- log end -->
为了方便后期升级可能替换为其他框架,所以我们采用slf4j框架的api来输入日志。所以需要添加对应的桥接依赖。
步骤2:
删除掉原有的log4j版本和logback日志依赖,如果系统中有的话。将系统中的API调用全部修改为根据slf4j的api来调用。
import org.slf4j.Logger; import org.slf4j.LoggerFactory;
private Logger logger = LoggerFactory.getLogger(Controller.class);
步骤3:
添加log4j2需要的配置文件,log4j2.xml,而且log4j2版本的日志不再支持properties的配置。
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="OFF" monitorInterval="1800"> <properties> <!-- 本地测试日志写路径--> <property name="LOG_HOME">/data/home/logs/***</property> <property name="FILE_NAME">XXXName</property> </properties> <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} |-%-5level %logger{80} - %msg%n" /> <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/> </Console> <RollingFile name="info-rolling" fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/${LOG_FILENAME}.%d{yyyy-MM-dd}.log" immediateFlush="false"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} |-%-5level %logger{80} - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy interval="24" modulate="true"/> </Policies> <Filters> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /> </Filters> <DefaultRolloverStrategy max="15" /> </RollingFile> <RollingFile name="error-rolling" fileName="${LOG_HOME}/${FILE_NAME}.err" filePattern="${LOG_HOME}/${LOG_FILENAME}-%d{yyyy-MM-dd}.err" immediateFlush="false"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} |-%-5level %logger{80} - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy interval="24" modulate="true"/> </Policies> <Filters> <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" /> </Filters> <DefaultRolloverStrategy max="15" /> </RollingFile> </Appenders> <Loggers> <!-- <Logger name="com.cssweb.test.app" level="trace" additivity="true"> <AppenderRef ref="running-log" /> </Logger> --> <logger name="org.springframework" level="INFO"></logger> <logger name="org.mybatis" level="INFO"></logger> <Root level="all"> <!-- 这里是输入到控制台--> <AppenderRef ref="Console" /> <!-- 这里是输入到文件,很重要--> <AppenderRef ref="info-rolling" /> <AppenderRef ref="error-rolling" /> </Root> </Loggers> </Configuration>
其中具体的关键字意义可以参考官方给出的说明文档。https://logging.apache.org/log4j/2.x/
步骤4:
启动项目观察日志是否正常打印,理想情况下,可能会打印,但是真实情况下,很难一次性成功。主要原因在于pom中的其他依赖加载了低版本的日志依赖导致不可用,比如说zookeeper的依赖,dubbo的依赖等。需要排除掉低版本的依赖,高版本才会有作用。那么如何确定是否包含低版本依赖呢。
通过idea打开project一栏,点击External Libraries查看
说明确实存在低版本的依赖,我们需要去除掉。有低版本的依赖,会导致高版本的不起作用。
步骤5:去除无用低版本依赖,打开maven工具栏,选中其中需要编译的项目,然后点击show Dependencies然后可以看到整体依赖图:
然后查找对应需要去除掉的依赖,然后点击Exclude即可去掉
将低版本的依赖全部去掉以后就可以开始正常日志打印了。
然后在项目启动过程中需要观察是否真正启动成功,因为有些依赖明确依赖了低版本的log4j,而你又想要高版本的日志打印,则只能升级对应的依赖,否则无法使用,比方大家常用的Dubbo版本如果用2.5.3版本,则无法使用新版本日志打印来打印,会报错。如果升级为2.6.3则可以正常使用。
所以建议虽然不采用最新版本的依赖,但是可以选择适当升级较新版本来获取高性能体验和带来的性能提升。