1、概述
Logback 是一个基于 Java 的日志框架,它提供了灵活的配置和强大的功能,包括将日志输出到不同目的地(如控制台、文件、数据库等)。
Java 中的日志框架分为两种,分别为:
- 日志门面:不负责日志具体实现,它只是为所有日志框架提供一套标准、规范的
API框架。 - 日志框架:负责日志具体实现。
Logback 由三个模块组成:
logback-core:基础模块,提供核心功能。logback-classic:实现了 SLF4J API,可以作为 log4j 的替代品。logback-access:与 Servlet 容器集成,提供 HTTP 访问日志功能。
Logback 依赖引入:在 Spring Boot 项目下,只需要引入 spring-boot-starter 依赖即可,这是因为 spring-boot-starter-logging 已经在 spring-boot-starter 中引入。
<!-- Spring Boot 启动依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>x.x.x</version>
</dependency>
在业务中输出日志的方式:
- 手动获取:需要在每个类中添加
private final Logger log = LoggerFactory.getLogger(xxx.class);来获取日志对象。 - Lombok:需要引入 Lombok 依赖,在每个类上添加
@Slf4J注解。
2、配置
Spring Boot 官方推荐在 src/resource 下使用 logback-spring.xml 文件作为 logback 的配置文件。
2.1 configuration
configuration:是 logback 配置文件中的根节点,定义了日志系统的总体结构和行为。
2.2 springProperty
springProperty:根据 Spring 的 active 参数决定选择哪种环境的日志输出。
springProperty 相关属性:
- scope:指定属性的作用域,通常设置为 "context",表示从 Spring 上下文中读取属性值。
- name:在 Logback 配置中定义的属性名称,用于在配置文件中引用。
- source:指定从 Spring 应用程序配置文件(如
application.properties)中读取的属性源。
示例:
<springProperty scope="context" name="app.name" source="spring.application.name"/>
2.3 appender
appender:定义日志的输出目的地和输出方式。
appender 相关属性:
- name:appender 中的唯一的名称,用于在
<logger>或<root>元素中引用。 - class:指定 appender 的实现类,这个类定义了日志数据的输出方式,如:
ch.qos.logback.core.ConsoleAppender:用于控制台输出。ch.qos.logback.core.FileAppender:用于文件输出。
appender 常用子节点:
1)encoder:定义日志的编码方式和输出格式。
<encoder>
<!-- 指定编码字符集 -->
<charset>UTF-8</charset>
<!-- 格式化输出 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
2)filter:定义日志过滤器,用于根据特定条件(如日志级别、日志消息内容等)过滤日志事件。
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
3)file:指定日志文件的名称,在 appender 的 class 属性为 ch.qos.logback.core.FileAppender 生效。
<file>${LOG_HOME}/error.log</file>
4)rollingPolicy:定义日志文件的滚动策略,如时间滚动或大小滚动。
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件输出的文件名 -->
<FileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!-- 保留日志文件的最大数量 -->
<MaxHistory>30</MaxHistory>
<!-- 用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志 -->
<totalSizeCap>1GB</totalSizeCap>
<!-- 日志滚动的最大文件大小 -->
<MaxFileSize>10MB</MaxFileSize>
</rollingPolicy>
5)append:指定是否在现有日志文件末尾追加日志。
<append>true</append>
6)prudent:指定是否在写入日志时采取谨慎模式。
<prudent>false</prudent>
2.4 logger
logger:用于为特定包或类设置日志记录的规则。
logger 常用属性:
- name:通常是类的全限定名或包名,。
- level:设置日志记录的级别,可以是 TRACE、DEBUG、INFO、WARN、ERROR、ALL 或 OFF。
- additivity:一个布尔值,决定日志事件是否应该向上级 logger 传递。默认值为
true。如果设置为false,则日志事件将仅在此 logger 处理,不会传递给上级 logger。 - includeCallerData:一个布尔值,用于指示是否应该包括调用者数据(如类名、方法名)在日志事件中。默认值为
false。
logger 常用子节点:
- appender-ref:引用一个或多个
<appender>的名称,这些 appender 将被用于此 logger 的日志输出。
示例:
<logger name="com.example" level="DEBUG" />
<logger name="com.example.myapp" level="INFO" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
2.5 root
root:表示日志系统的根 logger,是所有 logger 的祖先,提供了一个默认的日志记录级别和 appender 配置,适用于那些没有专门配置的 logger。
root 常用属性:
- level:设置根 logger 的日志级别,可以是 TRACE、DEBUG、INFO、WARN、ERROR、ALL 或 OFF。
root 常用子节点:
- appender-ref:引用一个或多个
<appender>的名称,这些 appender 将被用于根 logger 的日志输出。
示例:
<root level="INFO">
<appender-ref ref="APPLICATION"/>
<appender-ref ref="CONSOLE"/>
</root>
2.6 property
property:用于定义变量,这些变量可以在配置文件的其他部分中使用。
常用属性:
- name:变量的名称,这是一个字符串,用于在配置文件中引用变量。
- value:变量的值,这是实际的值,可以是任何字符串。
示例:
<property name="LOG_HOME" value="/path/to/your/logs" />
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<!-- 使用 LOG_HOME 变量 -->
<file>${LOG_HOME}/myapp.log</file>
<encoder>
<!-- 使用 LOG_PATTERN 变量 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>