Java日志体系(logback)

logback

1.1 简介

师出同门,与log4j一样,logback也是由Ceki Gülcü开发的开源日志组件,可以说是log4j的改进版;在现如今的项目中,logback的出现次数越来越多,是目前主流首选的日志记录工具。

1.2 logback结构

logback分成三个模块:logback-core,logback- classic,logback-access。

logback-core提供了logBack的核心功能,是另外两个组件的基础;

logback-classic模块实现了SLF4J API;

logback-access模块与Servlet容器集成提供Http来访问日志的功能。

1.3 使用

首先,需要在应用的pom.xml中添加依赖:

 
  1. <!--slf4j -->

  2. <dependency>

  3. <groupId>org.slf4j</groupId>

  4. <artifactId>slf4j-api</artifactId>

  5. <version>1.7.20</version>

  6. </dependency>

  7.  
  8. <!-- logback -->

  9. <dependency>

  10. <groupId>ch.qos.logback</groupId>

  11. <artifactId>logback-classic</artifactId>

  12. <version>1.1.7</version>

  13. </dependency>

  14. <dependency>

  15. <groupId>ch.qos.logback</groupId>

  16. <artifactId>logback-core</artifactId>

  17. <version>1.1.7</version>

  18. </dependency>

  19. <dependency>

  20. <groupId>ch.qos.logback</groupId>

  21. <artifactId>logback-access</artifactId>

  22. <version>1.1.7</version>

  23. </dependency>

其次,声明测试代码:

 
  1. import org.junit.Test;

  2. import org.slf4j.Logger;

  3. import org.slf4j.LoggerFactory;

  4.  
  5. public class slf4j_logbackDemo {

  6. Logger logger= LoggerFactory.getLogger(slf4j_logbackDemo.class);

  7.  
  8. @Test

  9. public void test() {

  10. logger.debug("debug message");

  11. logger.info("info message");

  12. logger.warn("warning message");

  13. logger.error("error message");

  14. logger.warn("login message");

  15. }

  16. }

最后,在classpath下声明配置文件:logback.xml;

 
  1. <!--每天生成一个文件,归档文件保存30天:-->

  2. <configuration >

  3.  
  4. <!--设置自定义pattern属性-->

  5. <property name="pattern" value="%d{HH:mm:ss.SSS} [%-5level] [%thread] [%logger] %msg%n"/>

  6.  
  7. <!--控制台输出日志-->

  8. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">

  9. <!--设置控制台输出日志的格式-->

  10. <encoder>

  11. <pattern>${pattern}</pattern>

  12. </encoder>

  13. </appender>

  14.  
  15. <!--滚动记录日志文件:-->

  16. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

  17. <!--当天生成的日志文件名称:-->

  18. <file>e:/log.out</file>

  19. <!--根据时间来记录日志文件:-->

  20. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

  21. <!--归档日志文件的名称:-->

  22. <fileNamePattern>testLog-%d{yyyy-MM-dd}.log</fileNamePattern>

  23. <!--归档文件保存30天-->

  24. <maxHistory>30</maxHistory>

  25. </rollingPolicy>

  26. <!--生成的日志信息格式-->

  27. <encoder>

  28. <pattern>${pattern}</pattern>

  29. </encoder>

  30. </appender>

  31.  
  32. <!--根root logger-->

  33. <root level="DEBUG">

  34. <!--设置根logger的日志输出目的地-->

  35. <appender-ref ref="FILE" />

  36. <appender-ref ref="CONSOLE" />

  37. </root>

  38.  
  39. </configuration>

通过以上步骤,logback就可以正常的运行了。

1.4 配置文件详解

(1)configuration:配置根节点

 
  1. <configuration scan="true" scanPeriod="60" debug="false"></configuration>

  2.  
  3. scan:程序运行时配置文件被修改,是否重新加载。true,重新加载;false,不重新加载;默认为true;

  4.  
  5. scanPeriod:监测配置文件被修改的时间间隔,scan属性必须设置为true才可生效;默认为1分钟,默认单位是毫秒;

  6.  
  7. debug:是否打印logback程序运行的日志信息。true,打印;false,不打印;默认为false;

(2)property:属性变量

 
  1. <configuration scan="true" scanPeriod="60" debug="false">

  2. <property name="pattern" value="%d{HH:mm:ss.SSS} [%-5level] [%logger] %msg%n" ></property>

  3. </configuration>

  4.  
  5. name:变量的名称,可以随意起名,但建议名字要简明直译;

  6.  
  7. value:变量的值;

  8.  
  9. 在配置文件中,我们可以用 ${} 的方式来使用,将变量引入到其他节点中去。如果有多处使用相同的内容,便可使用属性变量的方式进行统一,减少很多不必要的代码;

(3)logger<logger>:日志对象

 
  1. logger分为2种,一种是普通日志对象,另一种是根日志对象。对于大部分应用来说,只设置根日志对象即可。

  2. 在java日志系统中,无论是log4j还是logback,他们的日志对象体系都是呈现“树”的形式,根日志对象为最顶层节点,其余包或者类中的日志对象都继承于根日志节点;

  3.  
  4. 对于普通日志对象来说,我们可以设置某一个包或者某一个类的日志级别,还可以单独设置日志的输出目的地;

  5.  
  6. <configuration scan="true" scanPeriod="60" debug="false">

  7. <logger name="java.sql" level="debug" addtivity="true">

  8. <appender-ref ref="CONSOLE" />

  9. </logger>

  10. </configuration>

  11.  
  12. name:用来指定此logger属于哪个包或者哪个类;

  13.  
  14. level:用来指定此logger的日志打印级别;

  15.  
  16. addtivity:是否向上传递日志打印信息。之前说了,logger对象呈现一个树的结构,根logger是树的顶端,下面的子logger的addtivity属性如果设置为true则会向上传递打印信息,出现日志重复打印的现象;

  17.  
  18. appender-ref:日志输出目的地,将此logger所打印的日志交给此appender;

  19.  
  20. 值得注意的是,上面的例子中,如果此logger没有指定appender,而且addtivity也设置为true,那么此logger对应的日志信息只会打印一遍,是由root来完成的;但是如果addtivity设置成false,那么此logger将不会输出任何日志信息;

(3)logger<root>:根日志对象

 
  1. <root>也是日志对象中的一种,但它位于logger体系中的最顶层。当一个类中的logger对象进行打印请求时,如果配置文件中没有为该类单独指定日志对象,那么都会交给root根日志对象来完成;

  2.  
  3. <root>节点中只有一个level属性,还可以单独指定日志输除目的地<apender-ref>;

  4.  
  5. <configuration scan="true" scanPeriod="60" debug="false">

  6. <root level="DEBUG">

  7. <appender-ref ref="CONSOLE" />

  8. </root>

  9. </configuration>

(4)appender:日志输出目的地

与log4j中的appender一样,logback中的<appender>节点也同样负责日志输出的目的地。

appender中有2个必填属性--name和class。name为<appender>节点的名称,class为<appender>的全限定类名,也就是日志输出目的地的处理类。此外,我们还可以在<appender>中单独指定日志的格式,设置日志过滤器等操作;

 
  1. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">

  2. <encoder>

  3. <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>

  4. </encoder>

  5. </appender>

在logback中,主要有以下三种日志目的地处理类:

①ch.qos.logback.core.ConsoleAppender

 
  1. 将日志输出到控制台,可以在其节点中设置<encoder>子节点,设置日志输出的格式;

  2.  
  3. 例子:

  4. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">

  5. <encoder>

  6. <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>

  7. </encoder>

  8. </appender>

②ch.qos.logback.core.FileAppender

 
  1. 将日志输出到具体的磁盘文件中,可以单独指定具体的位置,也可以设置日志的输出格式;

  2.  
  3. 例子:

  4. <appender name="FILE" class="ch.qos.logback.core.FileAppender">

  5. <file>e:/log.out</file>

  6. <append>true</append>

  7. <prudent>false</prudent>

  8. <encoder>

  9. <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>

  10. </encoder>

  11. </appender>

  12.  
  13. 子节点<append>:新增的日志是否以追加到文件结尾的方式写入到log.out文件中,true为追加,fasle为清空现存文件写入;

  14. 子节点<prudent>:日志是否被安全的写入磁盘文件,默认为false。如果为true,则效率低下;

③ch.qos.logback.core.rolling.RollingFileAppender

 
  1. 滚动记录日志,当符合<rollingPolicy>节点中设置的条件时,会将现有日志移到新的文件中去。<rollingPolicy>节点中可设置的条件为:文件的大小、时间等;

  2.  
  3. 例子:

  4. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

  5. <file>e:/log.out</file>

  6. <append>true</append>

  7. <prudent>false</prudent>

  8. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

  9. <fileNamePattern>testLog-%d{yyyy-MM-dd}.log</fileNamePattern>

  10. <maxHistory>30</maxHistory>

  11. </rollingPolicy>

  12. <encoder>

  13. <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>

  14. </encoder>

  15. </appender>

④ch.qos.logback.classic.AsyncAppender

 
  1. 异步记录日志,内部通过使用缓存的方式来实现异步打印,将日志打印事件event放入缓存中。具体数据结构为BlockingQueue;

  2.  
  3. 例子:

  4. <appender name="FILE" class="ch.qos.logback.core.FileAppender">

  5. <file>e:/log.out</file>

  6. <append>true</append>

  7. <prudent>false</prudent>

  8. <encoder>

  9. <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>

  10. </encoder>

  11. </appender>

  12. <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">

  13. <discardingThreshold>0</discardingThreshold>

  14. <queueSize>512</queueSize>

  15. <appender-ref ref ="FILE"/>

  16. </appender>

  17.  
  18. 子节点<queueSize>:指的是BlockingQueue的队列容量大小,默认为256个;

  19. 子节点<discardingThreshold>:如果BlockingQueue中还剩余20%的容量,那么程序会丢弃TRACE、DEBUG和INFO级别的日志打印事件event,只保留WARN和ERROR级别的。为了保留所有的日志打印事件,可以将该值设置为0。

(5)rollingPolicy

日志文件的滚动策略,与RollingFileAppender搭配使用,当日志文件发生变动时决定RollingFileAppender的行为;

在<rollingPolicy>节点中有一个class属性,可选的值为TimeBasedRollingPolicy、FixedWindowRollingPolicy、TriggeringPolicy;

其中ch.qos.logback.core.rolling.TimeBasedRollingPolicy表示根据时间制定日志文件的滚动策略;

 
  1. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

  2. <fileNamePattern>testLog-%d{yyyy-MM-dd}.log</fileNamePattern>

  3. <maxHistory>30</maxHistory>

  4. </rollingPolicy>

ch.qos.logback.core.rolling.FixedWindowRollingPolicy表示如果日志文件大小超过指定范围时,会根据文件名拆分成多个文件;

 
  1. <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">

  2. <fileNamePattern>tests.%i.log.zip</fileNamePattern>

  3. <minIndex>1</minIndex>

  4. <maxIndex>3</maxIndex>

  5. </rollingPolicy>

(6)triggeringPolicy

与<rollingPolicy>节点一样,<triggeringPolicy>节点也属于日志滚动策略中的一种。

ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy表示根据日志文件大小,超过制定大小会触发日志滚动;

 
  1. <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">

  2. <maxFileSize>5MB</maxFileSize>

  3. </triggeringPolicy>

(7)encoder

日志格式化节点,负责格式化日志信息。<encoder>只负责了两件事情,第一负责将日志信息转换成字节数组,第二将字节数组写到输出流当中去;

在<encoder>中使用<pattern>来设置对应的格式;

 
  1. <encoder>

  2. <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>

  3. </encoder

%logger:表示输出logger名称,后面跟一个{0}表示:只输出logger最右边点符号之后的字符串;例如:com.jiaboyan.test ---> test;

%d{HH:mm:ss.SSS}:表示格式化日期输出,14:06:49.812;

%line:输出执行日志请求的行号。

%thread:表示产生日志的线程名;

%level:输出日志级别;

%method:输出执行日志请求的方法名;

%class:输出日志打印类的全限定名,后面跟{0}表示,含义为全限定类名最右边点符号之后的字符串。例如:com.jiaboyan.test ---> test;

%-4relative含义:符号减号“-”是左对齐 标志,接着是可选的最小宽度 修饰符,用十进制数表示。relative是输出从程序启动到创建日志记录的时间,单位是毫秒;

%msg:表示应用程序提供需要打印的日志信息;

%n:表示换行符;

猜你喜欢

转载自blog.csdn.net/suo082407128/article/details/86255975
今日推荐