spring+mybatis+druid集成log4j2

  • Post author:
  • Post category:其他


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