- 最近项目组中遇到因为日志量较大影响性能,性能测试效果较差,原项目引用的是log4j,于是升级为log4j2
将升级过程记录下来:
- 原来log文件注释:
2.新增log4j2引用
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.13</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.4.1</version>
</dependency>
<!--用于与slf4j保持桥接-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.4.1</version>
</dependency>
<!--web工程需要包含log4j-web,非web工程不需要-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.4.1</version>
</dependency>
<!--web工程需要包含log4j-web,非web工程不需要-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.4.1</version>
</dependency>
3.解除log4j的依赖(一定要把依赖删除干净)
maven.xml找到Dependency Hierarchy找到之前其他jar引用的所有lg4j相关包右键-Exclude Maven Artifact解除
4.添加log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="off">
<Properties> <!-- 配置日志文件输出目录,此配置将日志输出到tomcat根目录下的指定文件夹 -->
<Property name="LOG_HOME">E:/Logs/log
</Property>
</Properties>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) . -->
<ThresholdFilter level="INFO" onMatch="ACCEPT"
onMismatch="DENY" />
<!-- 输出日志的格式 -->
<PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n" />
</Console>
<RollingFile name="AppAppender" fileName="${LOG_HOME}/app.log"
filePattern="${LOG_HOME}/zip/log - %d{yyyy-MM-dd}.log.gz">
<PatternLayout>
<pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
</PatternLayout>
<Policies>
<!-- 每天切割日志 -->
<!-- <TimeBasedTriggeringPolicy interval="24" modulate="true"/> -->
<TimeBasedTriggeringPolicy interval="1"
modulate="true" />
</Policies>
<Filters>
<!-- 处理INFO及以上-->
<ThresholdFilter level="INFO" onMatch="ACCEPT"
onMismatch="DENY" />
</Filters>
</RollingFile>
<!-- <File name="log" fileName="E:log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M -
%msg%xEx%n"/>
</File> -->
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="AppAppender"/>
<AppenderRef ref="log"/>
</Root>
</Loggers>
</Configuration>
5.web.xml修改
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>/WEB-INF/classes/log4j2.xml</param-value>
</context-param>
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<filter>
<filter-name>log4jServletFilter</filter-name>
<filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>log4jServletFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
6.相关调用替换成Log logger = LogFactory.getLog(this.getClass());
7.activemq-all对log4j2的影响,如果你项目中引用了activemq-all会导致log4j2无效果,将其注释或则拆分引用。
之前因为activemq-all的问题导致log4j2没有效果,而且原因及其难排查。
8.异步功能的使用,如果使用log4j2但是不异步性能是提高不是很大,所以还是建议使用异步功能。
添加 <dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.2.0</version> </dependency>
在log4j2里面修改
<Loggers>
<AsyncLogger name="你需要异步的包例如:com.xx" level="trace" includeLocation="true" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="AppAppender" />
</AsyncLogger>
<asyncRoot level="trace" includeLocation="true">
<appender-ref ref="STDOUT" />
</asyncRoot>
全局异步就不说了因为也没去测试。
10.升级过后通过压测反应性能提升3倍,这个对企业应用来说已经是很大的提升了。