appender是LogBack中负责打印日志任务的组件。每一个appender都实现了ch.qos.logback.core.Appender 接口。 详细的文档可参考官网:LogBack用户手册——Appenders ,本文只对实际项目中常用的配置项作说明。
<appender>是<configuration>的子节点,有两个必要属性name和class。name指定appender名称,class指定appender的全类名。<appender>节点根据不同的class,可以有<encoder>、<filter>、<file>、<rollingpolicy>等子节点。
下文将介绍几个常用的appender。
ConsoleAppender 顾名思义,这个appender是用来将日志打印在控制台的。这个在上篇LogBack的配置文件详解(一) 中用到了很多次,例如配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?xml version="1.0" encoding="UTF-8" ?> <configuration > <appender name ="console" class ="ch.qos.logback.core.ConsoleAppender" > <encoder class ="ch.qos.logback.classic.encoder.PatternLayoutEncoder" > <pattern > 控制台appender|[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %class.%method : %msg%n</pattern > <charset > UTF-8</charset > </encoder > </appender > <root level ="INFO" > <appender-ref ref ="console" /> </root > </configuration >
FileAppender 把日志添加到文件,有以下子节点:
<file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
<append>:如果是true,日志被追加到文件结尾,如果是false,清空现存文件,默认是true。
<encoder>:对记录事件进行格式化。(具体参数稍后讲解 )
<prudent>:如果是 true,日志会被安全的写入文件,即使其他JVM上的FileAppender也在向此文件做写入操作,效率低,默认是 false。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <configuration > <appender name ="FILE" class ="ch.qos.logback.core.FileAppender" > <file > testFile.log</file > <append > true</append > <immediateFlush > true</immediateFlush > <encoder > <pattern > %-4relative [%thread] %-5level %logger{35} - %msg%n</pattern > </encoder > </appender > <root level ="DEBUG" > <appender-ref ref ="FILE" /> </root > </configuration >
RollingFileAppender 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。使用RollingFileAppender必须要设置rollingPolicy和triggeringPolicy。 RollingFileAppender有以下子节点:
<file>:RollingFileAppender的file子节点可以设置也可以不设置。如果没有设置,会按照<rollingPolicy>节点下的fileNamePattern中的值,自动创建对应的日志文件。
<append>:参考FileAppender中的说明。
<encoder>:参考FileAppender中的说明。
<rollingPolicy>:决定 RollingFileAppender 里的日志如何滚动,这会涉及文件移动和重命名。
<triggeringPolicy>: 设置 RollingFileAppender 何时触发日志滚动。
<prudent>:参考FileAppender中的说明。
rollingPolicy TimeBasedRollingPolicy 最常用的滚动策略,它根据时间来制定滚动策略,例如每隔一天或者一个月滚动一次。它有以下子节点:
<fileNamePattern>:这个节点用来定义日志文件名。它的值是一个文件名加一个%d的转换说明符。 “%d”可以包含一个java.text.SimpleDateFormat指定的“日期-时间”格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。
<maxHistory>:用来设置日志最多保罗多久。比如设置为30天,则30天以前的日志文件将被自动删除
encoder 负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。 目前PatternLayoutEncoder 是唯一有用的且默认的encoder ,有一个<pattern>节点,用来设置日志的输入格式。参考前面的文章LogBack日志打印格式详解 。另外一个<charset>节点是用来设置字符串转为字节数组时使用的编码,默认是系统的charset。
例如:
1 2 3 4 <encoder > <pattern > %-4relative [%thread] %-5level %logger{35} - %msg%n</pattern > <charset > UTF-8</charset > </encoder
filter 过滤器可以设置一个枚举值,即DENY,NEUTRAL,ACCEPT其中之一。
DENY,日志将立即被抛弃不再经过其他过滤器;
NEUTRAL,有序列表里的下个过滤器过接着处理日志;
ACCEPT,日志会被立即处理,不再经过剩余过滤器。
一个<Appender>节点下可以有多个<filter>节点,多个filter按照顺序执行。
常用的有两种过滤器:LevelFilter和ThresholdFilter
LevelFilter LevelFilter是用来做精确过滤匹配的。对于LevelFilter设置的日志级别,过滤器会根据onMatch和 onMismatch的值接收或拒绝日志。它有三个子节点:
<level>:设置过滤的日志级别
<onMatch>:用于配置对符合level级别的日志如何操作
<onMismatch>:用于配置对不符合level级别的日志如何操作
如下是一个配置示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 <?xml version="1.0" encoding="UTF-8" ?> <configuration > <property name ="LOG_FORMAT" value ="[%-5level] %d{yyyy-MM-dd HH:mm:SSS} [%thread] %logger{25} : %msg%n" /> <appender name ="console" class ="ch.qos.logback.core.ConsoleAppender" > <encoder class ="ch.qos.logback.classic.encoder.PatternLayoutEncoder" > <pattern > 控制台appender|[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %class.%method : %msg%n</pattern > <charset > UTF-8</charset > </encoder > <filter class ="ch.qos.logback.classic.filter.LevelFilter" > <level > INFO</level > <onMatch > ACCEPT</onMatch > <onMismatch > DENY</onMismatch > </filter > </appender > <appender name ="myAppender" class ="ch.qos.logback.core.ConsoleAppender" > <encoder class ="ch.qos.logback.classic.encoder.PatternLayoutEncoder" > <pattern > 自定义Appender|[%-5level] %d{yyyy-MM-dd HH:mm:SSS} [%thread] %logger{25} : %msg%n</pattern > <charset > UTF-8</charset > </encoder > </appender > <logger name ="com.lzumetal" > </logger > <logger name ="com.lzumetal.logback.LogBackDemo" level ="INFO" additivity ="true" > <appender-ref ref ="myAppender" /> </logger > <root level ="WARN" > <appender-ref ref ="console" /> </root > </configuration >
根据上面的配置,“console”这个appender只会打印info级别的日志。 打印效果如图:
ThresholdFilter ThresholdFilter是一个范围过滤,用来过滤掉低于指定日志级别的。比如指定level为“WARN”,则只会打印大于和等于“WARN”级别的日志。比如上面的配置文件改成这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 <?xml version="1.0" encoding="UTF-8" ?> <configuration > <property name ="LOG_FORMAT" value ="[%-5level] %d{yyyy-MM-dd HH:mm:SSS} [%thread] %logger{25} : %msg%n" /> <appender name ="console" class ="ch.qos.logback.core.ConsoleAppender" > <encoder class ="ch.qos.logback.classic.encoder.PatternLayoutEncoder" > <pattern > 控制台appender|[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %class.%method : %msg%n</pattern > <charset > UTF-8</charset > </encoder > <filter class ="ch.qos.logback.classic.filter.ThresholdFilter" > <level > WARN</level > </filter > </appender > <appender name ="myAppender" class ="ch.qos.logback.core.ConsoleAppender" > <encoder class ="ch.qos.logback.classic.encoder.PatternLayoutEncoder" > <pattern > 自定义Appender|[%-5level] %d{yyyy-MM-dd HH:mm:SSS} [%thread] %logger{25} : %msg%n</pattern > <charset > UTF-8</charset > </encoder > </appender > <logger name ="com.lzumetal" > </logger > <logger name ="com.lzumetal.logback.LogBackDemo" level ="INFO" additivity ="true" > <appender-ref ref ="myAppender" /> </logger > <root level ="WARN" > <appender-ref ref ="console" /> </root > </configuration >
打印的效果如图: