1.什么是log4jdbc以及log4jdbc的特性使用
使用java进行数据库操作时最痛苦的莫过于拼接SQL语句。在实际运行时往往需要查看实际生成的SQL语句和实际传入的参数,或许还会有查看SQL执行时间等的需求。
无论原生JDBC、dbutils、mybatis还是hibernate,使用log4j等日志框架可以看到生成的SQL,但是占位符和参数总是分开打印的。实在是不太友好。
例如:select * from t_user where age>? and (sex=? or dept_id=?)
log4jdbc能很好的解决上述问题。使用log4jdbc之后的效果如下:
select * from t_user where age>1 and (sex=0 or dept_id='007')
官网介绍:log4jdbc is a Java JDBC driver that can log SQL and/or JDBC calls (and optionally SQL timing information) for other JDBC drivers using the Simple Logging Facade For Java (SLF4J) logging system.
特性:
完全支持JDBC3和JDBC4
配置简单,一般情况下你只需要将你的DriverClass改为:net.sf.log4jdbc.DriverSpy,并在你的jdbcUrl之前拼接jdbc:log4
自动将占位符(?)替换为实际的参数
能够及时方便地显示SQL的实际执行时间
显示SQL Connection的数量的信息
能在JDK1.4+和SLF4J1.X上和大多数常见的JDBC驱动协同工作
open source
2.日志系统的选择,logback
logback是log4j团队创建的开源日志组件。与log4j类似,但是比log4j更强大,是log4j的改良版本。主要优势在于:
a) 更快的实现,logback内核重写过,是的性能有了很大的提升,内存占用也更小。
b) logback-classic对slf4j进行了更好的集成
c) 自动重新加载配置文件,当配置文件修改后,logback-classic能自动重新加载配置文件
d) 配置文件能够处理不同的情况,开发人员在不同的环境下(开发,测试,生产)切换的时候,不需要创建多个文件,可以通过<if><else><then>标签来实现
e) 自动压缩已经打出来的日志文件:RollingFileAppender在产生新文件的时候,会自动压缩已经打印出来的日志文件。而且这个压缩的过程是一个异步的过程。
3.logback与slf4j有什么区别?
slf4j是一系列的日志接口,而log4j和logback是具体实现了的日志框架。
a) log4j是apache实现的一个开源日志组件
b) logback同样是由log4j的作者实现的,拥有更好的特性,是slf4j的原生实现
4.整合使用
1)加入jar
<dependency>
<groupId>com.googlecode.log4jdbc</groupId>
<artifactId>log4jdbc</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>
2)application.yml 修改下面两行
spring:
datasource:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
url: jdbc:log4jdbc:mysql://127.0.0.1/test?characterEncoding=UTF-8
3)增加资源文件 log4jdbc.log4j2.properties
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
4)增加日志配置文件logback.xml
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>webapp</contextName>
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<!--普通日志输出到控制台-->
<root level="info">
<appender-ref ref="console" />
</root>
<!--监控sql日志输出 -->
<logger name="jdbc.sqlonly" level="INFO" additivity="false">
<appender-ref ref="console" />
</logger>
<logger name="jdbc.resultset" level="ERROR" additivity="false">
<appender-ref ref="console" />
</logger>
<logger name="jdbc.resultsettable" level="INFO" additivity="false">
<appender-ref ref="console" />
</logger>
<logger name="jdbc.connection" level="OFF" additivity="false">
<appender-ref ref="console" />
</logger>
<logger name="jdbc.sqltiming" level="OFF" additivity="false">
<appender-ref ref="console" />
</logger>
<logger name="jdbc.audit" level="OFF" additivity="false">
<appender-ref ref="console" />
</logger>
</configuration>
5.注意:log4jdbc默认使用的是slf4j作为日志门面,而slf4j具体的日志系统我们可以使用logback,所用我们只要引入
log4jbdc即可。尤其要记住吗,jdk自带的common-logging和slf4j只是日志的门面(说白了就只提供一些列的API接口),具体使用logback和log4j等日志系统
还是要取决于我们自己。
参考:http://www.360doc.com/content/14/0822/02/8072791_403817030.shtml
网友评论