LogBack的配置文件详解(二)—appender

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设置的日志级别,过滤器会根据onMatchonMismatch的值接收或拒绝日志。它有三个子节点:

  • <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>

打印的效果如图:

------ 本文完 ------