官方文档
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.foo 是 com.foo.Bar 的父级)
- Root Logger:位于 Logger 层次结构顶端,是所有 Logger 的祖先
- 获取方式:通过
LoggerFactory.getLogger() 方法获取
1 2 3 4 5 6 7 8
| import org.slf4j.Logger; import org.slf4j.LoggerFactory;
Logger rootLogger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
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"> <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" /> <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> <logger name="com.example" level="DEBUG" /> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root> </configuration>
|
配置元素说明
| 元素 |
说明 |
<configuration> |
根元素,可配置 scan(自动扫描)、scanPeriod(扫描间隔)、debug(调试模式) |
<property> |
定义变量,供后续引用 |
<appender> |
定义输出目的地,包含 name 和 class 属性 |
<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 类。