使用logback记录带有详细参数值的SQL
1.添加maven支持
<dependency>
<groupId>com.googlecode.usc</groupId>
<artifactId>jdbcdslog</artifactId>
<version>1.0.6.2</version>
</dependency>
<!-- logback日志配置开始 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.7</version>
</dependency>
<!-- logback日志配置结束 -->
2.配置web.xml
注:logback.xml新建的在src的目录下
<!-- 设置 log4j.properties 的路径-->
<context-param>
<param-name>log4jConfigLocation </param-name>
<!--<param-value>classpath:conf/log4j.properties</param-value> -->
<param-value>classpath:conf/logback.xml</param-value>
</context-param>
<!--设置刷新时间间隔-->
<context-param >
<param-name> log4jRefreshInterval</param-name>
<param-value>10000</param-value>
</context-param>
3.logback.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="1 seconds">
<!-- <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener> -->
<!-- 控制台打印 -->
<appender name="CON" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>logbak: %date [%level] %logger{36} %msg%n</pattern>
<!-- <pattern>logbak: %d[HH:mm:ss.SSS] %logger{36} - %msg%n</pattern>
<pattern>logbak: %date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern>
-->
</encoder>
</appender>
<!-- 日志文件打印 -->
<appender name="logfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--See also http://logback.qos.ch/manual/appenders.html#RollingFileAppender-->
<File>E:/run_log/spring4.log</File>
<encoder>
<pattern>logbak: %date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<maxIndex>9</maxIndex>
<FileNamePattern>E:/run_log/spring4.log.%i</FileNamePattern>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5120KB</MaxFileSize>
</triggeringPolicy>
</appender>
<logger name="org.springframework.web" level="ERROR" />
<logger name="spring4.java" level="INFO"/>
<!--
<logger name="org.jdbcdslog.ConnectionLogger" level="trace" />
<logger name="org.jdbcdslog.StatementLogger" level="trace" />
<logger name="org.jdbcdslog.SlowQueryLogger" level="trace" />
<logger name="org.jdbcdslog.ResultSetLogger" level="trace" />
-->
<!--<logger name="org.activiti.engine.impl.cfg" level="ERROR"/>
<logger name="com.client" level="debug"/>
<logger name="java.sql" level="debug"/>
<logger name="com.mybatis" level="debug"/>
<logger name="com.frame" level="debug"/> -->
<root level="INFO">
<appender-ref ref="CON"/>
<appender-ref ref="logfile"/>
</root>
</configuration>
4.applicationContext.xml配置数据源jdbcdslog插件代理
<!-- 数据源配置 -->
<bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="minPoolSize" value="1" />
<property name="maxPoolSize" value="100" />
<property name="initialPoolSize" value="3" />
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="60" />
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement" value="5" />
<property name="maxStatements" value="0" />
<!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
<property name="idleConnectionTestPeriod" value="60" />
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts" value="30" />
<!-- 获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试
获取连接失败后该数据源将申明已断开并永久关闭。Default: false -->
<property name="breakAfterAcquireFailure" value="false" />
<!-- 因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable
等方法来提升连接测试的性能。Default: false -->
<property name="testConnectionOnCheckout" value="false" />
</bean>
<!-- 数据源配置 增加日志配置 -->
<!-- 代理datasource,使其能够显式获取preparedStatement的参数值 -->
<bean id="dataSource" class="org.jdbcdslog.ConnectionPoolDataSourceProxy">
<property name="targetDSDirect" ref="dataSource2"/>
</bean>
<!-- 数据源配置 -->
<!-- Mybatis sessionfactory配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:conf/myBatisConfig.xml" />
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 通过扫描的模式,扫描目录在com/proj/*目录下,所有的DAO都继承com.proj.dao.BaseDAO接口的接口 -->
<bean name="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.frame,com.client" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<property name="markerInterface" value="com.frame.dao.BaseDAO" />
</bean>
<!-- 定义事务管理器(声明式的事务)-->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
5.日志打印效果:
6.将log4j.properties转换为logback.xml
项目之前的使用log4j.properties可以用
http://logback.qos.ch/translator/转换到等价的logback配置文件。
PS:转换后的配置文件,pattern参数需要修改。
如log4j的pattern配置 %-d{yyyy-MM-dd HH:mm:ss,SSS} [%c:%L]-[%p] %m%n 在logback里面不在起效。
我把它调整为 %date [%level] [%thread] %logger{80} [%file : %line] %msg%n
另外按日期产生日志文件策略的pattern也需要修改(具体查看下文的logback.xml配置文件)。
具体含义是:
参数 含义
%date 表示日期格式(yyyy-MM-dd HH:mm:ss,SSS)
%level 表示日志的级别
%thread 表示输出产生该日志的线程名
%logger{80} 表示logger名字最长80个字符,否则按照句点(.)分割
%file 表示文件名
%line 表示第几行
%msg 表示输出信息
%n 表示换行