配置说明


<!--
    scan 是否定期扫描xml文件, scanPeriod是说扫描周期是30秒
    scan:
    当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
    scanPeriod:
    设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
    debug:
    当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="30 seconds" debug="false" packagingData="true">
    <!-- 项目名称 -->
    <contextName>myApp1 contextName</contextName>
    <!-- 属性 -->
    <property name="USER_HOME" value="./log"/>

    <!-- Insert the current time formatted as "yyyyMMdd'T'HHmmss" under
       the key "bySecond" into the logger context. This value will be
       available to all subsequent configuration elements. -->
    <timestamp key="bySecond" datePattern="yyyyMMdd" timeReference="contextBirth"/>
    
    <!-- appender很重要,一个配置文件会有多个appender -->
    <!-- ConsoleApperder意思是从console中打印出来 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 过滤器,一个appender可以有多个 -->
        <!-- 阈值过滤,就是log行为级别过滤,debug及debug以上的信息会被打印出来 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>

        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <!-- encoder编码规则 -->
        <encoder>
            <!--<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>-->
            <!--<pattern>%d %contextName %msg%n</pattern>-->
            <!-- pattern模式 %d时间 %thread 线程名 %level行为级别 %logger logger名称 %method 方法名称 %message 调用方法的入参消息 -->
            <pattern>%-4d [%thread] %highlight%-5level %cyan%logger.%-10method - %message%n</pattern>
        </encoder>
    </appender>
    
    <!-- FileAppender 输出到文件 -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <!-- 文件存放位置 %{xxx} 就是之前定义的属性xxx -->
        <file>${USER_HOME}/myApp1log-${bySecond}.log</file>
        
        <encoder>
            <!-- %date和%d是一个意思 %file是所在文件 %line是所在行 -->
            <pattern>%date %level [%thread] %logger{30} [%file:%line] %msg%n</pattern>
        </encoder>
    </appender>
    
    <!-- 输出到HTML格式的文件 -->
    <appender name="HTMLFILE" class="ch.qos.logback.core.FileAppender">
        <!-- 过滤器,这个过滤器是行为过滤器,直接过滤掉了除debug外所有的行为信息 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <!-- HTML输出格式 可以和上边差不多 -->
            <layout class="ch.qos.logback.classic.html.HTMLLayout">
                <pattern>%relative%thread%mdc%level%logger%msg</pattern>
            </layout>
        </encoder>
        <file>${USER_HOME}/test.html</file>
    </appender>

    <!-- 滚动日志文件,这个比较常用 -->
    <appender name="ROLLINGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 当project等于true的时候file就不会起效果-->
        <prudent>true</prudent>
        <!--<file>${USER_HOME}/logFile.log</file>-->
        <!-- 按天新建log日志 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>${USER_HOME}/logFile.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <!-- 保留30天的历史日志 -->
            <maxHistory>30</maxHistory>
            
            <!-- 基于大小和时间,这个可以有,可以没有 -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- or whenever the file size reaches 100MB -->
                <!-- 当一个日志大小大于10KB,则换一个新的日志。日志名的%i从0开始,自动递增 -->
                <maxFileSize>10KB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <encoder>
            <!-- %ex就是指抛出的异常,full是显示全部,如果在{}中写入数字,则表示展示多少行 -->
            <pattern>%-4date [%thread] %-5level %logger{35} - %msg%n%ex{full, DISPLAY_EX_EVAL}</pattern>
        </encoder>
    </appender>

    <!-- 重点来了,上边都是appender输出源。这里开始就是looger了 -->
    <!-- name意思是这个logger管的哪一片,像下面这个管的就是log/test包下的所有文件 level是只展示什么行为信息级别以上的,类似阈值过滤器 additivity表示是否再抛出事件,就是说如果有一个logger的name是log,如果这个属性是true,另一个logger就会在这个logger处理完后接着继续处理 -->
    <logger name="log.test" level="INFO" additivity="false">
        <!-- 连接输出源,也就是上边那几个输出源 ,你可以随便选几个appender-->
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ROLLINGFILE"/>
        <appender-ref ref="HTMLFILE"/>
    </logger>
    <!-- 这个logger详细到了类 -->
    <logger name="log.test.Foo" level="debug" additivity="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ROLLINGFILE"/>
        <appender-ref ref="HTMLFILE"/>
    </logger>

    <!-- Strictly speaking, the level attribute is not necessary since -->
    <!-- the level of the root level is set to DEBUG by default.       -->
    <!-- 这就是上边logger没有管到的情况下 root默认接管所有logger -->
    <root level="debug">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

场景说明


第1种:只配置root

Xml代码  

  1. <configuration>   

  2.    

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

  4.     <!-- encoder 默认配置为PatternLayoutEncoder -->   

  5.     <encoder>   

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

  7.     </encoder>   

  8.   </appender>   

  9.    

  10.   <root level="INFO">             

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

  12.   </root>     

  13.      

  14.  </configuration>  

  其中appender的配置表示打印到控制台(稍后详细讲解appender );

<root level="INFO">将root的打印级别设置为“INFO”,指定了名字为“STDOUT”的appender。


当执行logback.LogbackDemo类的main方法时,root将级别为“INFO”及大于“INFO”的日志信息交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台;

打印结果如下:

 

Xml代码  

  1. 13:30:38.484 [main] INFO  logback.LogbackDemo - ======info  

  2. 13:30:38.500 [main] WARN  logback.LogbackDemo - ======warn  

  3. 13:30:38.500 [main] ERROR logback.LogbackDemo - ======error 


第2种:带有loger的配置,不指定级别,不指定appender

 

Xml代码  

  1. <configuration>   

  2.    

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

  4.     <!-- encoder 默认配置为PatternLayoutEncoder -->   

  5.     <encoder>   

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

  7.     </encoder>   

  8.   </appender>   

  9.    

  10.   <!-- logback为java中的包 -->   

  11.   <logger name="logback"/>   

  12.    

  13.   <root level="DEBUG">             

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

  15.   </root>     

  16.      

  17.  </configuration>  

 

 其中appender的配置表示打印到控制台(稍后详细讲解appender );

<logger name="logback" />将控制logback包下的所有类的日志的打印,但是并没用设置打印级别,所以继承他的上级<root>的日志级别“DEBUG”;

没有设置addtivity,默认为true,将此loger的打印信息向上级传递;

没有设置appender,此loger本身不打印任何信息。

<root level="DEBUG">将root的打印级别设置为“DEBUG”,指定了名字为“STDOUT”的appender。

 

当执行logback.LogbackDemo类的main方法时,因为LogbackDemo 在包logback中,所以首先执行<logger name="logback" />,将级别为“DEBUG”及大于“DEBUG”的日志信息传递给root,本身并不打印;

root接到下级传递的信息,交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台;

打印结果如下:

 

Xml代码  

  1. 13:19:15.406 [main] DEBUG logback.LogbackDemo - ======debug  

  2. 13:19:15.406 [main] INFO  logback.LogbackDemo - ======info  

  3. 13:19:15.406 [main] WARN  logback.LogbackDemo - ======warn  

  4. 13:19:15.406 [main] ERROR logback.LogbackDemo - ======error  

 

 

 第3种:带有多个loger的配置,指定级别,指定appender  

 

Xml代码  

  1. <configuration>   

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

  3.     <!-- encoder 默认配置为PatternLayoutEncoder -->   

  4.     <encoder>   

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

  6.     </encoder>   

  7.   </appender>   

  8.    

  9.   <!-- logback为java中的包 -->   

  10.   <logger name="logback"/>   

  11.   <!--logback.LogbackDemo:类的全路径 -->   

  12.   <logger name="logback.LogbackDemo" level="INFO" additivity="false">  

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

  14.   </logger>   

  15.     

  16.   <root level="ERROR">             

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

  18.   </root>     

  19. </configuration>  

 

其中appender的配置表示打印到控制台(稍后详细讲解appender );

 

<logger name="logback" />将控制logback包下的所有类的日志的打印,但是并没用设置打印级别,所以继承他的上级<root>的日志级别“DEBUG”;

没有设置addtivity,默认为true,将此loger的打印信息向上级传递;

没有设置appender,此loger本身不打印任何信息。

 

 <logger name="logback.LogbackDemo" level="INFO" additivity="false">控制logback.LogbackDemo类的日志打印,打印级别为“INFO”;

additivity属性为false,表示此loger的打印信息不再向上级传递,

指定了名字为“STDOUT”的appender。

 

<root level="DEBUG">将root的打印级别设置为“ERROR”,指定了名字为“STDOUT”的appender。

 

 当执行logback.LogbackDemo类的main方法时,先执行<logger name="logback.LogbackDemo" level="INFO" additivity="false">,将级别为“INFO”及大于“INFO”的日志信息交给此loger指定的名为“STDOUT”的 appender处理,在控制台中打出日志,不再向次loger的上级 <logger name="logback"/> 传递打印信息;

<logger name="logback"/>未接到任何打印信息,当然也不会给它的上级root传递任何打印信息;

打印结果如下:  

 

Xml代码  

  1. 14:05:35.937 [main] INFO  logback.LogbackDemo - ======info  

  2. 14:05:35.937 [main] WARN  logback.LogbackDemo - ======warn  

  3. 14:05:35.937 [main] ERROR logback.LogbackDemo - ======error  

 

 如果将<logger name="logback.LogbackDemo" level="INFO" additivity="false">修改为 <logger name="logback.LogbackDemo" level="INFO" additivity="true">那打印结果将是什么呢?

没错,日志打印了两次,想必大家都知道原因了,因为打印信息向上级传递,logger本身打印一次,root接到后又打印一次

打印结果如下:  

 

Xml代码  

  1. 14:09:01.531 [main] INFO  logback.LogbackDemo - ======info  

  2. 14:09:01.531 [main] INFO  logback.LogbackDemo - ======info  

  3. 14:09:01.531 [main] WARN  logback.LogbackDemo - ======warn  

  4. 14:09:01.531 [main] WARN  logback.LogbackDemo - ======warn  

  5. 14:09:01.531 [main] ERROR logback.LogbackDemo - ======error  

  6. 14:09:01.531 [main] ERROR logback.LogbackDemo - ======error  

说明

logger会继承父logger的appender,此时level还是当前logger的级别,不会受父logger中level级别的影响。当additivity为false时中断集成关系。