spring+mybatis+druid集成log4j2

log4j2是log4j的替代產品,log4j2支持異步讀寫,在日誌的讀寫性能上有很大的提升。相應的也就提升了系統的吞吐量。log4j沒有更新了,已經被拋棄,因此在新的項目中徹底能夠拋棄log4j,而後採用log4j2或者logback做爲日誌實現方案。java

本文主要是記錄log4j2與目前常採用的Spring+Spring MVC+Mybatis+druid架構的web項目環境的集成。關於log4j2的新特性和功能,請參考官網或者參閱他人博客。git

第一步:引入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作爲日誌接口。github

第二步:修改mybatis的log實現

在實際項目總都大體寫個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數據鏈接池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的配置文件以下: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減小沒必要要的配置

相關文章
相關標籤/搜索