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>
<!-- set immediateFlush to false for much higher logging throughput -->
<immediateFlush>true</immediateFlush>
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<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>
打印的效果如图: