logback-过滤器

转自:logback--过滤器


ok,这里先简单罗列下logback日志框架的好处,关于仔细的整理后面会专门写一篇博客的。

1,配置简单,易于上手
2,一个日志文件中只能某一个级别的日志
3,一个类中可以指定多个不同的日志,并且生成的每个日志文件中只包含其本身的内容
4,可以关闭或者打开某几个包的日志,并且可以设置不同的包使用不同的日志级别。


关于上面的第1点,第3点,第4点我前面博客里面都有整理到了。这里我们重点看下第2种情况:

日志级别及文件


考虑如下实际编码中经常遇见的场景:
日志记录采用分级记录,级别与日志文件名相对应,不同级别的日志信息记录到不同的日志文件中。例如:error级别记录到log_error_xxx.log或log_error.log(该文件为当前记录的日志文件),而log_error_xxx.log为归档日志,
日志文件按日期记录,同一天内,若日志文件大小等于或大于2M,则按0、1、2...顺序分别命名。例如log-level-2013-12-21.0.log。




OK,这里就要用到这篇博客讲的<filter>标签了。下面是具体代码和配置。

下面是一份配置文件:
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <!-- debug:打印logback内部日志信息,实时查看logback的运行状态,默认为false -->

  3. <!-- scan:配置文件如果发生改变,是否被重新加载,默认为true。 -->

  4. <!-- scanPeriod:设置检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒,默认的时间间隔为1分钟,默认为true。 -->

  5. <configuration debug="true" scan="true" scanPeriod="30 seconds">

  6.     <contextName>Application</contextName>

  7.     <!-- 时间戳定义,timeReference:使用日志产生日期为时间基准 -->

  8.     <timestamp key="byDay" datePattern="yyyy-MM-dd" timeReference="contextBirth" />

  9.     <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径,可以使用系统变量 -->

  10.     <!-- <property name="LOG_HOME" value="${app.home}/log" /> -->

  11.     <property name="LOG_HOME" value="log" />

  12.     <!-- 控制台输出,生产环境将请stdout去掉 -->

  13.     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

  14.         <encoder>

  15.             <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符 -->

  16.             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

  17.             </pattern>

  18.         </encoder>

  19.     </appender>


  20.     <!-- 按照每天生成日志文件 -->

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

  22.         <!-- 日志输出文件 -->

  23.         <file>${LOG_HOME}/LoggingBack-${byDay}.log</file>

  24.         <!-- 追加日志到原文件结尾 -->

  25.         <append>true</append>

  26.         <!-- timebasedrollingpolicy:演示时间和大小为基础的日志文件归档 -->

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

  28.             <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定。 -->

  29.             <!--可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。 -->

  30.             <!--而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->

  31.             <!-- 文件滚动日期格式:每天:.YYYY-MM-dd(默认);每星期:.YYYY-ww;每月:.YYYY-MM -->

  32.             <!-- 每隔半天:.YYYY-MM-dd-a;每小时:.YYYY-MM-dd-HH;每分钟:.YYYY-MM-dd-HH-mm -->

  33.             <fileNamePattern>${LOG_HOME}/log-%d{yyyy-MM-dd}.%i.log</fileNamePattern>

  34.             <!-- 控制归档文件的最大数量的保存,删除旧的文件,默认单位天数 -->

  35.             <maxHistory>7</maxHistory>

  36.             <!-- 设置当前日志的文件的大小,决定日志翻滚 -->

  37.             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

  38.                 <!-- 除按日志记录之外,还配置了日志文件不能超过10M(默认),若超过10M,日志文件会以索引0开始, -->

  39.                 <maxFileSize>10MB</maxFileSize>

  40.             </timeBasedFileNamingAndTriggeringPolicy>

  41.         </rollingPolicy>

  42.         <encoder>

  43.             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n

  44.             </pattern>

  45.         </encoder>

  46.     </appender>


  47.     <appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">

  48.         <!-- 这里添加一个过滤器 -->

  49.         <file>${LOG_HOME}/LoggingBack-info.log</file>

  50.         <filter class="ch.qos.logback.classic.filter.LevelFilter">

  51.             <level>INFO</level>

  52.             <onMatch>ACCEPT</onMatch>

  53.             <onMismatch>DENY</onMismatch>

  54.         </filter>

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

  56.             <fileNamePattern>${LOG_HOME}/LOG-INFO-%d{yyyy-MM-dd}.%i.log</fileNamePattern>

  57.             <maxHistory>7</maxHistory>

  58.             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

  59.                 <maxFileSize>10MB</maxFileSize>

  60.             </timeBasedFileNamingAndTriggeringPolicy>

  61.         </rollingPolicy>

  62.         <encoder>

  63.             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n

  64.             </pattern>

  65.         </encoder>

  66.     </appender>


  67.     <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">

  68.         <!-- 这里添加一个过滤器 -->

  69.         <file>${LOG_HOME}/LoggingBack-error.log</file>

  70.         <filter class="ch.qos.logback.classic.filter.LevelFilter">

  71.             <level>ERROR</level>

  72.             <onMatch>ACCEPT</onMatch>

  73.             <onMismatch>DENY</onMismatch>

  74.         </filter>

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

  76.             <fileNamePattern>${LOG_HOME}/LOG-ERROR-%d{yyyy-MM-dd}.%i.log</fileNamePattern>

  77.             <maxHistory>7</maxHistory>

  78.             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

  79.                 <maxFileSize>10MB</maxFileSize>

  80.             </timeBasedFileNamingAndTriggeringPolicy>

  81.         </rollingPolicy>

  82.         <encoder>

  83.             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n

  84.             </pattern>

  85.         </encoder>

  86.     </appender>


  87.     <!-- 可以写多个日志文件appender,然后区分多个模块的日志 -->

  88.     <appender name="LOGGINGBACK2" class="ch.qos.logback.core.rolling.RollingFileAppender">

  89.         <file>${LOG_HOME}/LoggingBack2.log</file>

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

  91.             <fileNamePattern>${LOG_HOME}/LOG-%d{yyyy-MM-dd}.%i.log</fileNamePattern>

  92.             <maxHistory>7</maxHistory>

  93.             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

  94.                 <maxFileSize>10MB</maxFileSize>

  95.             </timeBasedFileNamingAndTriggeringPolicy>

  96.         </rollingPolicy>

  97.         <encoder>

  98.             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n

  99.             </pattern>

  100.         </encoder>

  101.     </appender>


  102.     <!-- 指定一个包,name必填,additivity选填:控制是否继承父类appender,默认true -->

  103.     <!-- level选填,如果木有指定从最近的父类继承,顶级为root的级别 -->

  104.     <logger name="org.linkinpark.commons.logbackLogging" additivity="true">

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

  106.         <appender-ref ref="FILE-INFO" />

  107.         <appender-ref ref="FILE-ERROR" />

  108.     </logger>


  109.     <root level="DEBUG">

  110.         <appender-ref ref="STDOUT" />

  111.     </root>

  112. </configuration>



关于上面的配置文件说明:

我在上面的配置文件中一共定义了4个appender,然后一个是全局的日志输出文件,一个INFO级别的日志过滤输出,一个是ERROR级别的日志过滤输出,一个是特定名称的日志输出文件。

我们在使用的时候直接写<logger>标签里面引用这些appender就OK了。

下面是我们测试Java代码:

  1. package org.linkinpark.commons.logbackLogging;


  2. import org.junit.Test;

  3. import org.slf4j.Logger;

  4. import org.slf4j.LoggerFactory;


  5. public class LoggingBack

  6. {


  7.     private static Logger logger = LoggerFactory.getLogger(LoggingBack.class);


  8.     @Test

  9.     public void test()

  10.     {

  11.         logger.debug("LoggingBack.debug()。。。");

  12.         logger.info("LoggingBack.info()。。。");

  13.         logger.error("LoggingBack.error()。。。");

  14.     }


  15. }




测试上面的代码,junit绿条,然后项目的log文件夹下生成4个日志文件:

logback-2016-03-01.log,该文件里面包含了所有的日志输出,包含所有的日志等级

logback-info.log,该文件里面只包含INFO级别的日志输出

logback-error.log,该文件里面只包含ERROR级别的日志输出

logback2.log,该文件为空的,配置文件中我们并没有使用这个appender。

OK,现在我们来看下<filter>标签。
过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一。


返回DENY,日志将立即被抛弃不再经过其他过滤器;

返回NEUTRAL,有序列表里的下个过滤器过接着处理日志;

返回ACCEPT,日志会被立即处理,不再经过剩余过滤器。

过滤器被添加到<Appender> 中,为<Appender> 添加一个或多个过滤器后,可以用任意条件对日志进行过滤。<Appender> 有多个过滤器时,按照配置顺序执行。

下面是几个常用的过滤器:

1,LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。


有以下子节点:

<level>:设置过滤级别

<onMatch>:用于配置符合过滤条件的操作

<onMismatch>:用于配置不符合过滤条件的操作

例如:将过滤器的日志级别配置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。前面我已经举过例子了,这里就不做赘述了。

2,ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。


例如:过滤掉所有低于INFO级别的日志。下面是配置文件:

  1. <configuration>

  2.   <appender name="CONSOLE"

  3.     class="ch.qos.logback.core.ConsoleAppender">

  4.     <!-- 过滤掉 TRACE 和 DEBUG 级别的日志-->

  5.     <filter class="ch.qos.logback.classic.filter.ThresholdFilter">

  6.       <level>INFO</level>

  7.     </filter>

  8.     <encoder>

  9.       <pattern>

  10.         %-4relative [%thread] %-5level %logger{30} - %msg%n

  11.       </pattern>

  12.     </encoder>

  13.   </appender>

  14.   <root level="DEBUG">

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

  16.   </root>

  17. </configuration>


3,EvaluatorFilter: 求值过滤器,评估、鉴别日志是否符合指定条件。有一下子节点:


<evaluator>:鉴别器,常用的鉴别器是JaninoEventEvaluato,也是默认的鉴别器,它以任意的java布尔值表达式作为求值条件,求值条件在配置文件解释过成功被动态编译,布尔值表达式返回true就表示符合过滤条件。

evaluator有个子标签<expression>,用于配置求值条件

<onMatch>,用于配置符合过滤条件的操作

<onMismatch>,用于配置不符合过滤条件的操作


例如:过滤掉所有日志消息中不包含“billing”字符串的日志。配置文件如下:


  1. <configuration>


  2.   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

  3.     <filter class="ch.qos.logback.core.filter.EvaluatorFilter">

  4.       <evaluator> <!-- 默认为 ch.qos.logback.classic.boolex.JaninoEventEvaluator -->

  5.         <expression>return message.contains("billing");</expression>

  6.       </evaluator>

  7.       <OnMatch>ACCEPT </OnMatch>

  8.       <OnMismatch>DENY</OnMismatch>

  9.     </filter>

  10.     <encoder>

  11.       <pattern>

  12.         %-4relative [%thread] %-5level %logger - %msg%n

  13.       </pattern>

  14.     </encoder>

  15.   </appender>


  16.   <root level="INFO">

  17.     <appender-ref ref="STDOUT" />

  18.   </root>

  19. </configuration>


4,当然我们也可以自定义过滤器。


实现过程很简单,我们只需要写一个类实现filter接口就OK,里面实现decide()方法。

代码如下:

  1. package org.linkinpark.commons.logbackLogging;


  2. import ch.qos.logback.classic.spi.ILoggingEvent;

  3. import ch.qos.logback.core.filter.Filter;

  4. import ch.qos.logback.core.spi.FilterReply;


  5. public class LinkinFilter extends Filter<ILoggingEvent>

  6. {


  7.     @Override

  8.     public FilterReply decide(ILoggingEvent event)

  9.     {

  10.         if (event.getMessage().contains("LinkinPark"))

  11.         {

  12.             return FilterReply.ACCEPT;

  13.         }

  14.         else

  15.         {

  16.             return FilterReply.DENY;

  17.         }

  18.     }


  19. }


然后在配置文件中使用到该过滤器的地方配置<filter>就OK了


  1. <!-- 控制台输出,生产环境将请stdout去掉 -->

  2.     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

  3.         <filter class="org.linkinpark.commons.logbackLogging.LinkinFilter" />

  4.         <encoder>

  5.             <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符 -->

  6.             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

  7.             </pattern>

  8.         </encoder>

  9.     </appender>


测试代码如下:

  1. package org.linkinpark.commons.logbackLogging;


  2. import org.junit.Test;

  3. import org.slf4j.Logger;

  4. import org.slf4j.LoggerFactory;


  5. public class LoggingBack

  6. {


  7.     private static Logger logger = LoggerFactory.getLogger(LoggingBack.class);


  8.     @Test

  9.     public void test()

  10.     {

  11.         logger.debug("LoggingBack.debug()。。。");

  12.         logger.info("LoggingBack.info(LinkinPark)。。。");

  13.         logger.error("LoggingBack.error()。。。");

  14.     }


  15. }


运行上面的测试,我们来看下控制台输出:

  1. 10:39:32,945 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]

  2. 10:39:32,945 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]

  3. 10:39:32,945 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/Users/LinkinPark/WorkSpace/linkin-log-test/target/classes/logback.xml]

  4. 10:39:33,011 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Setting ReconfigureOnChangeFilter scanning period to 30 seconds

  5. 10:39:33,012 |-INFO in ReconfigureOnChangeFilter{invocationCounter=0} - Will scan for changes in [[/Users/LinkinPark/WorkSpace/linkin-log-test/target/classes/logback.xml]] every 30 seconds.

  6. 10:39:33,012 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Adding ReconfigureOnChangeFilter as a turbo filter

  7. 10:39:33,014 |-INFO in ch.qos.logback.classic.joran.action.ContextNameAction - Setting logger context name as [Application]

  8. 10:39:33,014 |-INFO in ch.qos.logback.core.joran.action.TimestampAction - Using context birth as time reference.

  9. 10:39:33,015 |-INFO in ch.qos.logback.core.joran.action.TimestampAction - Adding property to the context with key="byDay" and value="2016-03-01" to the LOCAL scope

  10. 10:39:33,016 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]

  11. 10:39:33,018 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]

  12. 10:39:33,038 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property

  13. 10:39:33,064 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]

  14. 10:39:33,066 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE]

  15. 10:39:33,085 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used

  16. 10:39:33,086 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern log/log-%d{yyyy-MM-dd}.%i.log for the active file

  17. 10:39:33,088 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@2096442d - The date pattern is 'yyyy-MM-dd' from file name pattern 'log/log-%d{yyyy-MM-dd}.%i.log'.

  18. 10:39:33,088 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@2096442d - Roll-over at midnight.

  19. 10:39:33,091 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@2096442d - Setting initial period to Tue Mar 01 10:39:13 CST 2016

  20. 10:39:33,092 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property

  21. 10:39:33,094 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - Active log file name: log/LoggingBack-2016-03-01.log

  22. 10:39:33,094 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - File property is set to [log/LoggingBack-2016-03-01.log]

  23. 10:39:33,095 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]

  24. 10:39:33,095 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE-INFO]

  25. 10:39:33,099 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used

  26. 10:39:33,099 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern log/LOG-INFO-%d{yyyy-MM-dd}.%i.log for the active file

  27. 10:39:33,100 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@7946e1f4 - The date pattern is 'yyyy-MM-dd' from file name pattern 'log/LOG-INFO-%d{yyyy-MM-dd}.%i.log'.

  28. 10:39:33,100 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@7946e1f4 - Roll-over at midnight.

  29. 10:39:33,100 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@7946e1f4 - Setting initial period to Tue Mar 01 10:39:13 CST 2016

  30. 10:39:33,100 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property

  31. 10:39:33,101 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE-INFO] - Active log file name: log/LoggingBack-info.log

  32. 10:39:33,101 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE-INFO] - File property is set to [log/LoggingBack-info.log]

  33. 10:39:33,101 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]

  34. 10:39:33,101 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE-ERROR]

  35. 10:39:33,103 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used

  36. 10:39:33,103 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern log/LOG-ERROR-%d{yyyy-MM-dd}.%i.log for the active file

  37. 10:39:33,103 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@3c09711b - The date pattern is 'yyyy-MM-dd' from file name pattern 'log/LOG-ERROR-%d{yyyy-MM-dd}.%i.log'.

  38. 10:39:33,103 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@3c09711b - Roll-over at midnight.

  39. 10:39:33,103 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@3c09711b - Setting initial period to Tue Mar 01 10:39:13 CST 2016

  40. 10:39:33,104 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property

  41. 10:39:33,104 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE-ERROR] - Active log file name: log/LoggingBack-error.log

  42. 10:39:33,104 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE-ERROR] - File property is set to [log/LoggingBack-error.log]

  43. 10:39:33,105 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]

  44. 10:39:33,105 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [LOGGINGBACK2]

  45. 10:39:33,106 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used

  46. 10:39:33,106 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern log/LOG-%d{yyyy-MM-dd}.%i.log for the active file

  47. 10:39:33,106 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@5cc7c2a6 - The date pattern is 'yyyy-MM-dd' from file name pattern 'log/LOG-%d{yyyy-MM-dd}.%i.log'.

  48. 10:39:33,106 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@5cc7c2a6 - Roll-over at midnight.

  49. 10:39:33,106 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@5cc7c2a6 - Setting initial period to Tue Mar 01 10:18:58 CST 2016

  50. 10:39:33,107 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property

  51. 10:39:33,107 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[LOGGINGBACK2] - Active log file name: log/LoggingBack2.log

  52. 10:39:33,107 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[LOGGINGBACK2] - File property is set to [log/LoggingBack2.log]

  53. 10:39:33,108 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [org.linkinpark.commons.logbackLogging] to true

  54. 10:39:33,108 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE] to Logger[org.linkinpark.commons.logbackLogging]

  55. 10:39:33,108 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE-INFO] to Logger[org.linkinpark.commons.logbackLogging]

  56. 10:39:33,109 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE-ERROR] to Logger[org.linkinpark.commons.logbackLogging]

  57. 10:39:33,109 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG

  58. 10:39:33,109 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]

  59. 10:39:33,109 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.

  60. 10:39:33,109 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@2344fc66 - Registering current configuration as safe fallback point

  61. 10:39:33.114 [main] INFO  o.l.c.logbackLogging.LoggingBack - LoggingBack.info(LinkinPark)。。。




OK,只输出了包含我们“LinkinPark”字符串的日志,没问题。




  • 补充

最后我们在这里在补充2点关于logback的知识,就可以结束logback相关的整理了。

1,日志文件颜色光亮


logback的官网上日志输出颜色可以加高亮颜色的,但是很遗憾我尝试了下控制台输出是乱码,所以这里暂时贴出官网上说的,以后再说吧。

================================================================================


Coloring


Grouping by parentheses as explained above allows coloring of sub-patterns. As of version 1.0.5, PatternLayoutrecognizes
"%black", "%red", "%green","%yellow","%blue", "%magenta","%cyan", "%white", "%gray", "%boldRed","%boldGreen", "%boldYellow", "%boldBlue", "%boldMagenta""%boldCyan", "%boldWhite" and "%highlight" as conversion words. These conversion words are intended to contain
a sub-pattern. Any sub-pattern enclosed by a coloring word will be output in the specified color.

Below is a configuration file illustrating coloring. Note the %cyan conversion specifier enclosing "%logger{15}". This will output the logger name abbreviated to 15 characters in cyan. The %highlight conversion specifier prints its sub-pattern in bold-red for
events of level ERROR, in red for WARN, in BLUE for INFO, and in the default color for other levels.

Example: Highlighting levels (logback-examples/src/main/java/chapters/layouts/highlighted.xml)View
as .groovy

<configuration debug="true">
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- On Windows machines setting withJansi to true enables ANSI
         color code interpretation by the Jansi library. This requires
         org.fusesource.jansi:jansi:1.8 on the class path.  Note that
         Unix-based operating systems such as Linux and Mac OS X
         support ANSI color codes by default. -->
    <withJansi>true</withJansi>
    <encoder>
      <pattern>[%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n</pattern>
    </encoder>
  </appender>
  <root level="DEBUG">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

Here is the corresponding output:


[main] WARN  c.l.TrivialMain - a warning message 0
[main] DEBUG c.l.TrivialMain - hello world number1
[main] DEBUG c.l.TrivialMain - hello world number2
[main] INFO  c.l.TrivialMain - hello world number3
[main] DEBUG c.l.TrivialMain - hello world number4
[main] WARN  c.l.TrivialMain - a warning message 5
[main] ERROR c.l.TrivialMain - Finish off with fireworks

It takes very few lines of code to create a coloring conversion word. The section entitled creating
a custom conversion specifier
 discusses the steps necessary for registering a conversion word in your configuration file.



====================================================================================================================================================================================


2,log4j.propertites文件转logback.xml文件。


打开logback官网,在左下角有一个在线转log4j的配置文件成logback配置文件的工具,挺好的,我自己尝试过,没问题。

所以以后如果我们原来的项目用的是log4j的日志系统的话想切成logback的话,直接这里转下配置文件,然后代码一行都不用动,挺好的。

在线转文件的地址如下:log4j.prorpertites转成logback.xml文件