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減小沒必要要的配置