logback

232 阅读4分钟

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 配置文件中的根节点,定义了日志系统的总体结构和行为。

image.png

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:定义日志的输出目的地和输出方式。

image.png

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>