抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文介绍了Logback的使用方法和核心组件,以及配置说明。

环境

Windows 10 企业版 LTSC 21H2
Java 1.8
Maven 3.6.3
Logback 1.2.11

1 基本配置

1.1 管理依赖

添加依赖:

pom.xml
1
2
3
4
5
6
<!-- Logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>

1.2 配置文件

Logback默认查找以下配置文件:

  • logback.groovy
  • logback-test.xml
  • logback.xml
  • 若未找到,使用默认配置,仅将INFO级别的日志输出到控制台

创建配置文件:

logback.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 过滤器,控制输出级别 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 只输出INFO及以上级别 -->
<level>INFO</level>
</filter>
<!-- 编码器,定义输出格式 -->
<encoder>
<!-- 字符编码 -->
<charset>UTF-8</charset>
<!-- 日志格式 -->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %level %logger{50} - %msg%n</pattern>
</encoder>
</appender>

<!-- 根配置 -->
<root level="info">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>

1.3 记录日志

在代码中记录日志:

java
1
2
3
4
5
6
7
8
9
10
public class Demo {
private static final Logger logger = LoggerFactory.getLogger(Demo.class);
public static void main(String[] args) {
logger.trace("跟踪信息");
logger.debug("调试信息");
logger.info("普通信息");
logger.warn("警告信息");
logger.error("错误信息");
}
}

2 核心组件

2.1 Logger

Logger负责触发日志记录,是开发者直接操作的对象。

日志级别从低到高:

  • TRACE:跟踪信息,最细粒度的信息。
  • DEBUG:调试信息,用于开发阶段记录程序执行过程。
  • INFO:普通信息,用于记录普通流程信息。
  • WARN:警告信息,用于记录潜在危险信息。
  • ERROR:错误信息,用于记录异常错误信息。

记录不同级别日志:

java
1
2
3
4
5
6
7
8
9
10
public class Demo {
private static final Logger logger = LoggerFactory.getLogger(Demo.class);
public static void main(String[] args) {
logger.trace("跟踪信息");
logger.debug("调试信息");
logger.info("普通信息");
logger.warn("警告信息");
logger.error("错误信息");
}
}

支持通过{}参数化日志:

java
1
2
3
4
5
6
public class Demo {
private static final Logger logger = LoggerFactory.getLogger(Demo.class);
public static void main(String[] args) {
logger.info("{}登录成功,角色是{}", "张三", "用户");
}
}

2.2 Appender

Appender负责定义日志输出到哪里,比如控制台、文件、数据库等。

一个Logger可以关联多个Appender,每个Appender可以有不同的输出级别和过滤器。

输出到控制台:

logback.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 过滤器,控制输出级别 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 只输出INFO及以上级别 -->
<level>INFO</level>
</filter>
<!-- 编码器,定义输出格式 -->
<encoder>
<!-- 字符编码 -->
<charset>UTF-8</charset>
<!-- 日志格式 -->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %level %logger{50} - %msg%n</pattern>
</encoder>
</appender>

输出到文件,滚动记录:

logback.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 日志文件路径 -->
<file>./logs/app.log</file>
<!-- 滚动策略,按时间和大小分割 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 文件命名规则 -->
<fileNamePattern>./logs/app-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 单个文件最大10MB -->
<maxFileSize>10MB</maxFileSize>
<!-- 保留30天日志 -->
<maxHistory>30</maxHistory>
<!-- 所有文件最大1GB -->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<!-- 编码器,定义输出格式 -->
<encoder>
<!-- 字符编码 -->
<charset>UTF-8</charset>
<!-- 日志格式 -->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %level %logger{50} - %msg%n</pattern>
</encoder>
<!-- 追加模式 -->
<append>true</append>
</appender>

2.3 Encoder

Encoder负责定义日志的输出格式。

常用格式占位符:

符号 含义
%d{pattern} 日期,pattern为日期格式:
  • yyyy:年
  • MM:月
  • dd:日
  • HH:小时(24小时制)
  • hh:小时(12小时制)
  • mm:分
  • ss:秒
  • SSS:毫秒
%t | %thread 线程名
%p | %level 日志级别
%c{len} | %logger{len} 全类名,len表示长度,超过会从最外层包名开始缩写
%m | %msg 日志消息
%n 换行符
%F | %file 文件名
%L | %line 行号,影响性能,生产慎用
%M | %method 方法名,影响性能,生产慎用
%X{key} MDC变量,需要在代码中设置变量
%ex | %exception 异常堆栈,需要在调用时传入异常对象
%r | %relative 从程序启动到记录日志的毫秒数

3 配置说明

3.1 configuration

配置文件的根元素。

常用属性:

属性名 作用 取值
scan 是否自动扫描配置文件变更 默认为false表示不扫描,设置为true表示扫描
scanPeriod 扫描周期 默认为1分钟,单位为毫秒
debug 是否开启调试模式 默认为false表示不开启,设置为true表示开启

示例:

logback.xml
1
2
<configuration scan="true" scanPeriod="30 seconds" debug="true">
</configuration>

3.2 property

定义变量,可以通过${变量名}引用。

示例:

logback.xml
1
2
<!-- 日志输出格式 -->
<property name="PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %level %logger{50} - %msg%n"/>

3.3 appender

定义日志输出级别和输出位置。

常用属性:

属性名 作用 取值
name 名称,用于引用 字符串
class 全类名,支持多种输出方式 字符串

3.4 logger

定义特定包或者类的日志行为。

在Logger中可以关联多个Appender,每个Appender可以有不同的过滤器和编码器,对Logger支持的日志级别进行二次过滤。

常用属性:

属性名 作用 取值
name 包名或类名 字符串
level 可以使用的日志级别 日志级别:
  • trace:跟踪级别
  • debug:调试级别
  • info:普通级别
  • warn:警告级别
  • error:错误级别
  • off:关闭日志
additivity 是否在上级Logger输出日志,会导致重复输出 默认为true表示在上级Logger输出日志,设置为false表示不在上级Logger输出日志

示例:

logback.xml
1
2
3
4
<logger name="com.example.demo" level="debug" additivity="false">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</logger>

3.5 root

设置默认日志级别和输出位置,是所有Logger的父元素。

示例:

logback.xml
1
2
3
4
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>

4 参考配置

示例:

logback.xml
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<!-- 日志根目录 -->
<property name="LOG_HOME" value="./logs"/>
<!-- 日志输出格式 -->
<property name="PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %level %logger{50} - %msg%n"/>
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 过滤器,控制输出级别 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 只输出INFO及以上级别 -->
<level>INFO</level>
</filter>
<!-- 编码器,定义输出格式 -->
<encoder>
<!-- 字符编码 -->
<charset>UTF-8</charset>
<!-- 日志格式 -->
<pattern>${PATTERN}</pattern>
</encoder>
</appender>

<!-- 文件输出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 日志文件路径 -->
<file>${LOG_HOME}/app.log</file>
<!-- 滚动策略,按时间和大小分割 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 文件命名规则 -->
<fileNamePattern>${LOG_HOME}/app-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 单个文件最大100MB -->
<maxFileSize>100MB</maxFileSize>
<!-- 保留30天日志 -->
<maxHistory>30</maxHistory>
<!-- 所有文件最大1GB -->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<!-- 编码器,定义输出格式 -->
<encoder>
<!-- 字符编码 -->
<charset>UTF-8</charset>
<!-- 日志格式 -->
<pattern>${PATTERN}</pattern>
</encoder>
<!-- 追加模式 -->
<append>true</append>
</appender>

<!-- 错误日志输出 -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 日志文件路径 -->
<file>${LOG_HOME}/error.log</file>
<!-- 滚动策略,按时间分割 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件命名规则 -->
<fileNamePattern>${LOG_HOME}/error-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 保留30天日志 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 过滤器,控制输出级别 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 只输出ERROR级别 -->
<level>ERROR</level>
<!-- 匹配则接受 -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配则拒绝 -->
<onMismatch>DENY</onMismatch>
</filter>
<!-- 编码器,定义输出格式 -->
<encoder>
<!-- 字符编码 -->
<charset>UTF-8</charset>
<!-- 日志格式 -->
<pattern>${PATTERN}</pattern>
</encoder>
</appender>

<!-- 根配置 -->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="FILE_ERROR"/>
</root>
</configuration>

评论