配置说明
<!--
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代码
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默认配置为PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
其中appender的配置表示打印到控制台(稍后详细讲解appender );
<root level="INFO">将root的打印级别设置为“INFO”,指定了名字为“STDOUT”的appender。
当执行logback.LogbackDemo类的main方法时,root将级别为“INFO”及大于“INFO”的日志信息交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台;
打印结果如下:
Xml代码
13:30:38.484 [main] INFO logback.LogbackDemo - ======info
13:30:38.500 [main] WARN logback.LogbackDemo - ======warn
13:30:38.500 [main] ERROR logback.LogbackDemo - ======error
第2种:带有loger的配置,不指定级别,不指定appender
Xml代码
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默认配置为PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- logback为java中的包 -->
<logger name="logback"/>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</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代码
13:19:15.406 [main] DEBUG logback.LogbackDemo - ======debug
13:19:15.406 [main] INFO logback.LogbackDemo - ======info
13:19:15.406 [main] WARN logback.LogbackDemo - ======warn
13:19:15.406 [main] ERROR logback.LogbackDemo - ======error
第3种:带有多个loger的配置,指定级别,指定appender
Xml代码
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默认配置为PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- logback为java中的包 -->
<logger name="logback"/>
<!--logback.LogbackDemo:类的全路径 -->
<logger name="logback.LogbackDemo" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
<root level="ERROR">
<appender-ref ref="STDOUT" />
</root>
</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代码
14:05:35.937 [main] INFO logback.LogbackDemo - ======info
14:05:35.937 [main] WARN logback.LogbackDemo - ======warn
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代码
14:09:01.531 [main] INFO logback.LogbackDemo - ======info
14:09:01.531 [main] INFO logback.LogbackDemo - ======info
14:09:01.531 [main] WARN logback.LogbackDemo - ======warn
14:09:01.531 [main] WARN logback.LogbackDemo - ======warn
14:09:01.531 [main] ERROR logback.LogbackDemo - ======error
14:09:01.531 [main] ERROR logback.LogbackDemo - ======error
说明
logger会继承父logger的appender,此时level还是当前logger的级别,不会受父logger中level级别的影响。当additivity为false时中断集成关系。