logback日志系统

来源:互联网 发布:淘宝网海南黄花梨手串 编辑:程序博客网 时间:2024/05/18 01:59

SLF4J是一套简单的日志外观模式的Java API,帮助在项目部署时对接各种日志实现。

SLF4J

SLF4J是简单的日志外观模式框架,抽象了各种日志框架例如Logback、Log4j、Commons-logging和JDK自带的logging实现接口。它使得用户可以在部署时使用自己想要的日志框架。SLF4J是轻量级的,在性能方面几乎是零消耗的。

SLF4J没有替代任何日志框架,它仅仅是标准日志框架的外观模式。如果在类路径下除了SLF4J再没有任何日志框架,那么默认状态是在控制台输出日志。

Logback

Logback是Log4j的改进版本,而且原生支持SLF4J(因为是同一作者开发的),因此从其它日志框架如Log4j或JDK的logging迁移到Logback是完全可行的。

由于Logback原生支持SLF4J,因此Logback+SLF4J的组合是日志框架的最佳选择,比SLF4J+其它日志框架的组合要快一些。而且Logback的配置可以是XML或Groovy代码。

注意一个重要的特性,Logback通过JMX修改日志配置(比如日志级别从Debug调整到INFO),可以从JMX控制台直接操作,无需重启应用程序。

SLF4J API用法

1. 从org.slf4j包导入Logger和LoggerFactory

[java] view plaincopyprint?
  1. import org.slf4j.Logger;  
  2. import org.slf4j.LoggerFactory;  

2. 声明日志类

[java] view plaincopyprint?
  1. private final Logger logger = LoggerFactory.getLogger(LoggingSample.class);  

3. 使用debug、warn、info、error方法并跟踪适合的参数。

所有的方法默认都使用字符串作为输入。

[java] view plaincopyprint?
  1. logger.info("This is sample info statement");  

SLF4J结合Logback

在pom.xml包含下面的依赖:它会自动包含所有的依赖包logback-core、slf4j-api……
[html] view plaincopyprint?
  1. <dependency>  
  2.   <groupId>ch.qos.logback</groupId>  
  3.   <artifactId>logback-classic</artifactId>  
  4.   <version>1.0.7</version>  
  5. </dependency>  

SLF4J能用于现有的日志框架如Log4j、Commons-logging、java.util.logging(JUL)。

SLF4J结合Log4j

在pom.xml包含下面的依赖
[html] view plaincopyprint?
  1. <dependency>  
  2.   <groupId>org.slf4j</groupId>  
  3.   <artifactId>slf4j-log4j12</artifactId>  
  4.   <version>1.7.2</version>  
  5. </dependency>  

SLF4J结合JUL (java.util.logging)

在pom.xml包含下面的依赖

[html] view plaincopyprint?
  1. <dependency>  
  2.   <groupId>org.slf4j</groupId>  
  3.   <artifactId>slf4j-jdk14</artifactId>  
  4.   <version>1.7.2</version>  
  5. </dependency>  

主配置文件为logback.xml,放在src目录下或是WEB-INF/classes下,logback会自动加载

logback.xml的基本结构如下:

[xhtml] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <configuration>  
  3. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
  4.     <encoder>  
  5.       <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>  
  6.     </encoder>  
  7.   </appender>  
  8.   <root level="DEBUG"><appender-ref ref="STDOUT" /></root>  
  9. </configuration>  

logback.xml的基本配置信息都包含在configuration标签中,需要含有至少一个appender标签用于指定日志输出方式和输出格式,root标签为系统默认日志进程,通过level指定日志级别,通过appender-ref关联前面指定顶的日志输出方式。

例子中的appender使用的是ch.qos.logback.core.ConsoleAppender类,用于对控制台进行日志输出

其中encoder标签指定日志输出格式为“时间 线程 级别 类路径 信息”

logback的文件日志输出方式还提供多种日志分包策略

 1.文件日志

[xhtml] view plaincopy
  1. <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">  
  2.     <file>E:/logs/mylog.txt</file>  
  3.     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
  4.       <!-- rollover daily -->  
  5.       <fileNamePattern>E:/logs/mylog-%d{yyyy-MM-dd_HH-mm}.%i.log</fileNamePattern>  
  6.       <maxHistory>5</maxHistory>   
  7.       <timeBasedFileNamingAndTriggeringPolicy  
  8.             class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">  
  9.         <!-- or whenever the file size reaches 100MB -->  
  10.         <maxFileSize>100MB</maxFileSize>  
  11.       </timeBasedFileNamingAndTriggeringPolicy>  
  12.     </rollingPolicy>  
  13.     <encoder>  
  14.       <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern>  
  15.     </encoder>  
  16.   </appender  

文件日志输出采用的ch.qos.logback.core.rolling.RollingFileAppender类,它的基本属性包括<file>指定输入文件路径,encoder指定日志格式。其中,rollingPolicy标签指定的是日志分包策略,ch.qos.logback.core.rolling.TimeBasedRollingPolicy类实现的是基于时间的分包策略,分包间隔是根据fileNamePattern中指定的事件最小单位,比如例子中的%d{yyyy-MM-dd_HH-mm}的最小事件单位为分,它的触发方式就是1分钟,策略在每次想日志中添加新内容时触发,如果满足条件,就将mylog.txt复制到E:/logs/目录并更名为mylog-2010-06-22_13-13.1.log,并删除原mylog.txt。maxHistory的值为指定E:/logs目录下存在的类似mylog-2010-06-22_13-13.1.log文件的最大个数,当超过时会删除最早的文件。此外,策略还可以互相嵌套,比如本例中在时间策略中又嵌套了文件大小策略,ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP实现对单文件大小的判断,当超过maxFileSize中指定大大小时,文件名中的变量%i会加一,即在不满足时间触发且满足大小触发时,会生成mylog-2010-06-22_13-13.1.log和mylog-2010-06-22_13-13.2.log两个文件。

 2.数据库日志

 [xhtml] view plaincopy

  1. <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">  
  2.     <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">  
  3.        <dataSource  
  4.         class="com.mchange.v2.c3p0.ComboPooledDataSource">  
  5.       <driverClass>com.mysql.jdbc.Driver</driverClass>  
  6.       <url>jdbc:mysql://127.0.0.1:3306/databaseName</url>  
  7.       <user>root</user>  
  8.       <password>root</password>  
  9.       </dataSource>  
  10.     </connectionSource>  
  11.   </appender>  

 数据库输出使用ch.qos.logback.classic.db.DBAppender类,数据源支持c3p0数据连接池,例子中使用的MySql,其他配置方式请参考官方文档。

使用数据库输出需要在数据库中建立3个表,建表脚本如下

[xhtml] view plaincopy
  1. # Logback: the reliable, generic, fast and flexible logging framework.  
  2. # Copyright (C) 1999-2010, QOS.ch. All rights reserved.  
  3. #  
  4. # See http://logback.qos.ch/license.html for the applicable licensing   
  5. # conditions.  
  6. # This SQL script creates the required tables by ch.qos.logback.classic.db.DBAppender.  
  7. #  
  8. # It is intended for MySQL databases. It has been tested on MySQL 5.1.37   
  9. # on Linux  
  10.   
  11. BEGIN;  
  12. DROP TABLE IF EXISTS logging_event_property;  
  13. DROP TABLE IF EXISTS logging_event_exception;  
  14. DROP TABLE IF EXISTS logging_event;  
  15. COMMIT;  
  16.   
  17. BEGIN;  
  18. CREATE TABLE logging_event   
  19.   (  
  20.     timestmp         BIGINT NOT NULL,  
  21.     formatted_message  TEXT NOT NULL,  
  22.     logger_name       VARCHAR(254) NOT NULL,  
  23.     level_string      VARCHAR(254) NOT NULL,  
  24.     thread_name       VARCHAR(254),  
  25.     reference_flag    SMALLINT,  
  26.     arg0              VARCHAR(254),  
  27.     arg1              VARCHAR(254),  
  28.     arg2              VARCHAR(254),  
  29.     arg3              VARCHAR(254),  
  30.     caller_filename   VARCHAR(254) NOT NULL,  
  31.     caller_class      VARCHAR(254) NOT NULL,  
  32.     caller_method     VARCHAR(254) NOT NULL,  
  33.     caller_line       CHAR(4) NOT NULL,  
  34.     event_id          BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY  
  35.   );  
  36. COMMIT;  
  37. BEGIN;  
  38. CREATE TABLE logging_event_property  
  39.   (  
  40.     event_id          BIGINT NOT NULL,  
  41.     mapped_key        VARCHAR(254) NOT NULL,  
  42.     mapped_value      TEXT,  
  43.     PRIMARY KEY(event_id, mapped_key),  
  44.     FOREIGN KEY (event_id) REFERENCES logging_event(event_id)  
  45.   );  
  46. COMMIT;  
  47. BEGIN;  
  48. CREATE TABLE logging_event_exception  
  49.   (  
  50.     event_id         BIGINT NOT NULL,  
  51.     i                SMALLINT NOT NULL,  
  52.     trace_line       VARCHAR(254) NOT NULL,  
  53.     PRIMARY KEY(event_id, i),  
  54.     FOREIGN KEY (event_id) REFERENCES logging_event(event_id)  
  55.   );  
  56. COMMIT;  

 3.其他

此外logback还提供基于mail,基于jmx等多种日志输出方式,你也可以通过继承ch.qos.logback.core.AppenderBase 自己写appender实现

 

除了使用默认的日志主线程<root>外,还可以通过<logger>标签定制其他日志线程如:

   [xhtml] view plaincopy

  1. <logger name="com.test" level="DEBUG">  
  2.         <appender-ref ref="STDOUT" />  
  3.       </logger>  

其中name指定线程针对的包路径,level是日志级别,<appender-ref>定义使用那种appender。

例如要实现打印jdbc提交的sql,可以加入如下logger:

<logger name="java.sql.Connection" level="DEBUG"><appender-ref ref="STDOUT" /></logger>

 贴出我完整的logback.xml

[xhtml] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <configuration>  
  3.   <!-- log output to file  -->  
  4.   <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">  
  5.     <file>E:/logs/mylog.txt</file>  
  6.     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
  7.       <!-- rollover daily -->  
  8.       <fileNamePattern>E:/logs/mylog-%d{yyyy-MM-dd_HH-mm}.%i.log</fileNamePattern>  
  9.       <maxHistory>5</maxHistory>   
  10.       <timeBasedFileNamingAndTriggeringPolicy  
  11.             class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">  
  12.         <!-- or whenever the file size reaches 100MB -->  
  13.         <maxFileSize>100MB</maxFileSize>  
  14.       </timeBasedFileNamingAndTriggeringPolicy>  
  15.     </rollingPolicy>  
  16.     <encoder>  
  17.       <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern>  
  18.     </encoder>  
  19.   </appender>  
  20. <!-- log output to console  -->  
  21. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
  22.     <encoder>  
  23.       <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>  
  24.     </encoder>  
  25.   </appender>  
  26. <!--  log output to db-->  
  27. <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">  
  28.     <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">  
  29.        <dataSource  
  30.         class="com.mchange.v2.c3p0.ComboPooledDataSource">  
  31.       <driverClass>com.mysql.jdbc.Driver</driverClass>  
  32.       <url>jdbc:mysql://127.0.0.1:3306/tunneldb</url>  
  33.       <user>root</user>  
  34.       <password>123123</password>  
  35.       </dataSource>  
  36.     </connectionSource>  
  37.   </appender>  
  38.   
  39.     <logger name="com.ttt.ttt" level="DEBUG">  
  40.         <appender-ref ref="STDOUT" />  
  41.     </logger>  
  42.    
  43.     <logger name="java.sql.Connection" level="DEBUG"><appender-ref ref="STDOUT" /></logger>  
  44.      <!--  打印sql  
  45.     <logger name="java.sql.Statement" level="DEBUG"><appender-ref ref="STDOUT" /></logger>  
  46.     <logger name="java.sql.PreparedStatement" level="DEBUG"><appender-ref ref="STDOUT" /></logger>  
  47.       
  48.     <logger name="java.sql.ResultSet" level="DEBUG"><appender-ref ref="STDOUT" /></logger>  
  49.     -->  
  50.   <root level="DEBUG"><appender-ref ref="ROLLING" /></root>  
  51. </configuration>  

 总结:logback提供了丰富而高效的日志输出方式,并通过滚动策略,将实施时复杂的备份策略整合,极大的简化的部署成本,有兴趣的朋友可已考虑放到自己的项目里.官方提供了几百页的文档,内容相当详细,更多的内容请参照官方文档。


0 0
原创粉丝点击