log4j2是log4j的替代产品,log4j2支持异步读写,在日志的读写性能上有很大的提升。相应的也就提升了系统的吞吐量。log4j没有更新了,已经被抛弃,因此在新的项目中彻底能够抛弃log4j,而后采用log4j2或者logback做为日志实现方案。java
本文主要是记录log4j2与目前常采用的Spring+Spring MVC+Mybatis+druid架构的web项目环境的集成。关于log4j2的新特性和功能,请参考官网或者参阅他人博客。git
<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作为日志接口。github
在实际项目总都大体写个mybatis-config.xml的配置文件,咱们须要将里面的logImpl的实现改为log4j2web
文件内容以下:sql
<?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配置片断以下:数据库
<!-- 配置数据库链接池(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配置文件须要放到maven项目的resource下,log4j2.xml的配置文件以下:apache
<?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出处jsonjson
<Console name="Console" target="SYSTEM_OUT"> <JsonLayout compact="true" eventEol="true" /> </Console>
整合的其实只有几步,可是须要注意几点:缓存
(1) mybatis的版本必须至少到3.2.8,不然是没法在mybatis中使用log4j2的mybatis
(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减小没必要要的配置