log4j2是log4j的替代产品,log4j2支持异步读写,在日志的读写性能上有很大的提高。相应的也就提高了系统的吞吐量。log4j没有更新了,已经被抛弃,所以在新的项目中完全可以抛弃log4j,然后采用log4j2或者logback作为日志实现方案。
本文主要是记录log4j2与目前常采用的Spring+Spring MVC+Mybatis+druid架构的web项目环境的集成。关于log4j2的新特性和功能,请参考官网或者参阅他人博客。
第一步:引入log4j2相关依赖
<log4j2.version>2.8.1</log4j2.version>
<!--加入log4j依赖-->
<!--use log4j2-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!--log4j2 Asynchronous Loggers requires disruptor-->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.6</version>
</dependency>
如果不需要使用log4j2的异步logger则无需引入disruptor的依赖,在项目实现中,为了不造成系统强依赖于某一个log实现 框架,项目统一采用slf4j做为日志接口。
第二步:修改mybatis的log实现
在实际项目总都大致写个mybatis-config.xml的配置文件,我们需要将里面的logImpl的实现改成log4j2
文件内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!--是否开启缓存-->
<setting name="cacheEnabled" value="true"/>
<!--是否开启mybatis自动转驼峰-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--log4j2-->
<setting name="logImpl" value="LOG4J2"/>
</settings>
<!--配置分页插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
</plugin>
</plugins>
</configuration>
第三步:配置druid数据连接池filter
druid配置片段如下:
<!-- 配置数据库连接池(Druid) -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<property name="maxActive" value="20" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="SELECT 'x'" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize"
value="20" />
<!-- 配置监控统计拦截的filters,采用log4j2作为日志实现 -->
<property name="filters" value="stat,log4j2" />
</bean>
第四步:创建log4j2.xml配置文件
log4j2.xml配置文件需要放到maven项目的resource下,log4j2.xml的配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<properties>
<property name="LOG_HOME">logs/</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}
- %msg%n"/>
</Console>
<RollingRandomAccessFile name="infoLog" fileName="${LOG_HOME}/app.log"
filePattern="${LOG_HOME}/app.%d{yyyy-MM-dd}-%i.log.gz" append="true">
<PatternLayout pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread]
[%level][%class][%line]:%message%n"/>
<Filters>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
</Filters>
<Policies>
<!-- 对应 filePattern维度,此处为天数-->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<!--mybatis debug log-->
<AsyncLogger name="log4j.logger.org.mybatis" level="debug" additivity="false">
<!--<appender-ref ref="Console"/>-->
<AppenderRef ref="infoLog"/>
</AsyncLogger>
<AsyncLogger name="log4j.logger.java.sql" level="debug" additivity="false">
<!--<appender-ref ref="Console"/>-->
<AppenderRef ref="infoLog"/>
</AsyncLogger>
<AsyncLogger name="log4j.logger.java.sql.Connection" level="debug" additivity="false">
<!--<appender-ref ref="Console"/>-->
<AppenderRef ref="infoLog"/>
</AsyncLogger>
<AsyncLogger name="log4j.logger.java.sql.Statement" level="debug" additivity="false">
<!--<appender-ref ref="Console"/>-->
<AppenderRef ref="infoLog"/>
</AsyncLogger>
<AsyncLogger name="log4j.logger.java.sql.PreparedStatement" level="debug" additivity="false">
<!--<appender-ref ref="Console"/>-->
<AppenderRef ref="infoLog"/>
</AsyncLogger>
<AsyncLogger name="log4j.logger.java.sql.ResultSet" level="debug" additivity="false">
<!--<appender-ref ref="Console"/>-->
<AppenderRef ref="infoLog"/>
</AsyncLogger>
<!--TRACE、DEBUG、INFO、WARN、ERROR和FATAL-->
<Root level="trace">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
日志文件中配置,将logger都配置成了Async异步logger,如果想要同步日志,则将AsyncLogger改写成logger,如果需要使用json格式输出则可以配置log4j2出处json
<Console name="Console" target="SYSTEM_OUT">
<JsonLayout compact="true" eventEol="true" />
</Console>
总结
整合的其实只有几步,但是需要注意几点:
(1) mybatis的版本必须至少到3.2.8,否则是无法在mybatis中使用log4j2的
(2) druid的版本虽然没有具体测试过最低版本是那个,但是大概的最低版本是1.0.23或者是1.0.24。因为以前我在使用druid的时候是不能直接配置log4j2的,在2016年初的时候我在githup上反馈过,后来发布新版本才可以直接使用log4j2
(3) 如果使用的web环境是servlet 2.x,则还需log4j2的web过滤器和监听器配置到web.xml中,然后引入log4j2的web模块,因此建议新的项目都是用servlet3.0减少不必要的配置
转载于:https://my.oschina.net/u/1760791/blog/888785