官方文档

https://logback.qos.ch/manual/index.html

三大模块

Logback 分为三个模块:

模块 说明
logback-core 其他两个模块的基础,提供核心功能
logback-classic log4j 的改良版本,完整实现了 SLF4J API
logback-access 与 Servlet 容器集成,提供 HTTP 访问日志功能

核心架构

Logback 建立在三个主要类之上:Logger、Appender 和 Layout

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌─────────────────────────────────────────────────────┐
│ 应用程序 │
│ (使用 SLF4J API 记录日志) │
└─────────────────────┬───────────────────────────────┘


┌─────────────────────────────────────────────────────┐
│ Logger (日志记录器) │
│ - 获取日志实例 │
│ - 设置日志级别 │
│ - 按层次结构组织 │
└─────────────────────┬───────────────────────────────┘


┌─────────────────────────────────────────────────────┐
│ Appender (输出目的地) │
│ 控制台 │ 文件 │ 数据库 │ 远程服务器 │ ... │
└─────────────────────┬───────────────────────────────┘


┌─────────────────────────────────────────────────────┐
│ Layout/Encoder (格式化) │
│ 将日志事件转换为字符串输出 │
└─────────────────────────────────────────────────────┘

注意:Logger 类属于 logback-classic 模块,而 Appender 和 Layout 接口属于 logback-core 模块。

Logger(日志记录器)

Logger 是日志记录的核心组件,负责捕获日志信息:

  • 层次结构:Logger 名称遵循层次命名规则(如 com.foocom.foo.Bar 的父级)
  • Root Logger:位于 Logger 层次结构顶端,是所有 Logger 的祖先
  • 获取方式:通过 LoggerFactory.getLogger() 方法获取
1
2
3
4
5
6
7
8
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

// 获取 Root Logger
Logger rootLogger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);

// 获取指定名称的 Logger,也可以使用My App.class
Logger logger = LoggerFactory.getLogger("com.example.MyApp");

Appender(输出目的地)

Appender 负责将日志输出到指定的目的地。主要类型包括:

Appender 类型 说明
ConsoleAppender 输出到控制台(System.out/System.err)
FileAppender 输出到单个文件
RollingFileAppender 支持日志文件滚动(按大小、时间等)

⚠️ 注意:控制台输出相对较慢,生产环境应避免高频率输出到控制台。

Layout(格式化)

Layout 负责将日志事件转换为格式化后的字符串。最常用的是 PatternLayout,通过转换词(Conversion Word) 定义日志格式。

常用转换词:

转换词 说明 示例
%d{pattern} 日期时间 %d{yyyy-MM-dd HH:mm:ss.SSS}
%thread 线程名称 [%thread]
%-5level 日志级别(左对齐,5字符) %-5level
%logger{length} Logger 名称 %logger{36}
%msg 日志消息 %msg
%n 换行 %n

配置

配置文件位置

默认配置文件名为 logback.xml,放置在 src/main/resources 目录下。Spring Boot 项目中可使用 logback-spring.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
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 1. 定义属性 -->
<property name="LOG_PATH" value="/var/log/myapp" />
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />

<!-- 2. 定义 Appender -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>

<!-- 3. 配置 Logger -->
<logger name="com.example" level="DEBUG" />

<!-- 4. 配置 Root Logger -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>

配置元素说明

元素 说明
<configuration> 根元素,可配置 scan(自动扫描)、scanPeriod(扫描间隔)、debug(调试模式)
<property> 定义变量,供后续引用
<appender> 定义输出目的地,包含 nameclass 属性
<logger> 配置特定包/类的日志级别
<root> 配置根 Logger 的级别和引用的 Appender

滚动策略

RollingFileAppender 支持文件滚动:

  • TimeBasedRollingPolicy:按时间滚动(如每天生成新文件)
  • SizeBasedTriggeringPolicy:按文件大小触发滚动

日志级别

Logback 日志级别(从低到高):

1
TRACE < DEBUG < INFO < WARN < ERROR

级别过滤规则:Logger 只输出级别 大于或等于 配置级别的日志。

过滤器(Filter)

Logback 提供多层过滤机制:

过滤器类型 说明
LevelFilter 基于级别精确匹配过滤
ThresholdFilter 基于级别阈值过滤(≥指定级别)

过滤器返回三个值之一:

  • ACCEPT:接受该日志事件
  • DENY:拒绝该日志事件
  • NEUTRAL:交给后续过滤器判断

SLF4J 与 Logback 的关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌─────────────────────────────────────────────────────────────┐
│ 应用程序代码 │
│ import org.slf4j.Logger; │
│ LoggerFactory.getLogger(...) │
└─────────────────────────┬───────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ SLF4J (日志门面) │
│ 提供统一的日志 API 接口 │
└─────────────────────────┬───────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ Logback (日志实现 - 原生支持 SLF4J) │
│ 无需适配器,直接实现 SLF4J 接口 │
└─────────────────────────────────────────────────────────────┘
  • SLF4J 是日志门面(Facade),定义日志 API 规范
  • Logback 是日志实现,原生实现 SLF4J API,无需适配层
  • 应用程序只需依赖 SLF4J API,可在不修改代码的情况下切换日志实现

快速上手

添加依赖(Maven)

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.18</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.5.6</version>
</dependency>

编写代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyApp {
private static final Logger logger = LoggerFactory.getLogger(MyApp.class);

public static void main(String[] args) {
logger.trace("Trace message");
logger.debug("Debug message");
logger.info("Info message");
logger.warn("Warn message");
logger.error("Error message", new Exception("Something went wrong"));
}
}

注意:在大多数情况下,代码只需导入 SLF4J 的类,无需直接引用 Logback 类。