日志配置

规范:项目开发不要使用System.ut.println(),应该用日志记录信息

image-20250527110648134

简介

  1. Spring 使用commons - logging作为内部日志,但底层日志实现是开放的。可对接其他日志框架。

    • spring5 及以后 commons - logging被spring直接自己写了
  2. 支持 jul,log4j2,logback。SpringBoot 提供了默认的控制台输出配置,也可以配置输出为文件。

  3. logback 是默认使用的。Log4j 被弃用了,一般用 Log4j2

  4. 虽然日志框架很多,但是我们不用担心,使用 SpringBoot 的默认配置就能工作的很好。

虽然默认是 Logback,但 Spring Boot 也支持对接其他日志框架,如 Java Util Logging(JUL)、Log4j2 等。不过在引入其他日志框架时,需要注意排除默认的 Logback 相关依赖,避免冲突。例如若要使用 Log4j2,需在pom.xml中添加 Log4j2 依赖,并排除 Spring Boot 默认的 Logback 依赖:

Spring Boot 是如何把日志默认配置好的

  1. 每个 starter 场景,都会默认导入一个核心场景 spring-boot-starter
  2. 这个核心场景里面,本身就导入了日志场景,引入了日志的所有功能,这个是默认存在的
  3. 默认了使用了 logback + slf4j 作为默认底层日志
  4. 日志是系统一启动就用的,xxxAutoConfiguration 是系统启动好了以后放好的组件,项目启动完成后来用的
  5. 日志是利用监听器机制配置好的。ApplicationListener
  6. 日志所有的配置都可以通过修改配置文件实现。以 logging 开始的所有配置。

假如maven依赖中添加了spring-boot-starter-logging

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>

但是呢,实际开发中我们不需要直接添加该依赖。 spring-boot-starter其中包含了 spring-boot-starter-logging,该依赖内容就是 Spring Boot 默认的日志框架logback。

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

日志格式

以随便的几条为例子

1
2
3
4
2025-05-27 14:22:51.330 [main] DEBUG e.s.e.s.SpringBootPriticalApplication - Running with Spring Boot v3.5.0, Spring v6.2.7
2025-05-27 14:22:51.331 [main] INFO e.s.e.s.SpringBootPriticalApplication - No active profile set, falling back to 1 default profile: "default"
2025-05-27 14:22:51.854 [main] INFO o.s.d.r.config.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
2025-05-27 14:22:51.854 [main] INFO o.s.d.r.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode.

默认输出格式:

  • 时间和日期:格式为 yyyy-MM-dd HH:mm:ss.SSS,记录日志生成的精确时间。
  • 日志级别:ERROR WARN INFO DEBUG TRACE
  • 进程ID:
  • ---- :消息分隔符
  • 线程名:使用 [] 包含,执行当前代码的线程名称(如mainhttp-nio-8080-exec-1)。
  • Logger 名:通常是产生日志的类名,是类的全限定名(如com.example.MyService),用于定位日志来源。
  • 消息:日志记录的内容

注意:logback 没有 FATAL 级别,对应的是 ERROR

修改日志格式:

通过 logging.pattern.console 属性可以自定义控制台日志格式。例如,将默认格式修改为

1
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} ===> %msg%n

格式说明

  • %d{...}:时间戳格式。
  • %-5level:左对齐的日志级别(宽度 5 个字符)。
  • [%thread]:线程名。
  • %logger{15}:Logger 名称(缩写为 15 个字符)。
  • ===>:自定义分隔符。
  • %msg:日志消息。
  • %n:换行符。

默认值:参照:spring - boot 包 additional - spring - configuration - metadata.json 文件

实际项目中使用日志记录信息

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
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class LoggingExampleApplication implements CommandLineRunner {

// 创建Logger实例(通常放在类的顶部)
private static final Logger logger = LoggerFactory.getLogger(LoggingExampleApplication.class);

public static void main(String[] args) {
// 启动时记录日志
logger.info("应用启动中...");
SpringApplication.run(LoggingExampleApplication.class, args);
logger.info("应用已成功启动!");
}

@Override
public void run(String... args) throws Exception {
// 初始化数据时记录日志
logger.info("正在初始化应用数据...");
// 模拟数据加载
Thread.sleep(1000);
logger.info("数据初始化完成!");
}

@GetMapping("/hello")
public String sayHello() {
// 处理请求时记录日志
logger.debug("收到/hello请求");

try {
// 业务逻辑
String result = "Hello, World!";
// 可以指定参数
logger.info("请求处理成功,返回结果: {}", result);
return result;
} catch (Exception e) {
// 异常处理
logger.error("请求处理失败", e);
return "Error occurred";
}
}
}

可以使用{} 占位符来拼接字符串,而不需要使用+来连接字符串。

日志级别

  • 由低到高:ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF;
  • 只会打印指定级别及以上级别的日志
    • ALL:打印所有日志
    • TRACE:追踪框架详细流程日志,一般不使用
    • DEBUG:开发调试细节日志
    • INFO:关键、感兴趣信息日志
    • WARN:警告但不是错误的信息日志,比如:版本过时
    • ERROR:业务错误日志,比如出现各种异常
    • FATAL:致命错误日志,比如 jvm 系统崩溃
    • OFF:关闭所有日志记录
  • 不指定级别的所有类,都使用 root 指定的级别作为默认级别
  • Spring Boot 日志默认级别是 INFO
  1. 在 application.properties/yaml 中配置logging.level.=指定日志级别
  2. level 可取值范围:TRACE, DEBUG, INFO, WARN, ERROR, FATAL, or OFF,定义在 LogLevel 类中
  3. root 的 logger - name 叫 root,可以配置logging.level.root=warn,代表所有未指定日志级别都使用 root 的 warn 级别

Spring Boot 支持通过 logging.level 配置不同包的日志级别:

1
2
3
4
5
6
# 全局级别
logging.level.root=INFO

# 可以精确到包,指定包级别
logging.level.com.example=DEBUG
logging.level.org.springframework=WARN

在运行命令后加入--debug标志,如:$ java -jar springTest.jar --debug 也可以切换日志级别

日志分组

作用

日志分组是一种将相关的日志记录器(Logger)归为一组进行统一配置的机制。它能更便捷地管理和控制日志输出,尤其是在项目规模较大、涉及众多模块和依赖时,通过分组可避免逐一配置每个 Logger 的繁琐操作。

  • 简化配置:将多个相关的 Logger 归为一组,只需针对组设置一次日志级别等配置,就能统一应用到组内所有 Logger,避免了对每个 Logger 单独设置的重复操作。

Spring Boot 默认创建了一些预定义的日志分组

  • sql 组:通常用于与 SQL 相关的日志记录,与 SQL 语句执行、参数绑定等相关的日志记录器可能会被纳入这个组。
  • web 组:主要涵盖与 Web 相关的日志。像 Spring MVC 或 Spring WebFlux 处理 HTTP 请求、响应的过程,包括请求的接收、处理、返回响应等环节的日志记录器可能会在这个组。

自定义日志分组

除了使用预定义分组,开发者还能根据项目需求自定义日志分组,步骤如下:

  • 在配置文件中定义分组:在application.propertiesapplication.yaml配置文件中进行定义。以application.properties为例,假设要创建一个名为myGroup的日志分组,包含com.example.service包下的所有 Logger 以及com.example.repository.UserRepository类对应的 Logger,可以这样配置:

    1
    logging.group.myGroup=com.example.service,com.example.repository.UserRepository
  • 配置分组的日志级别:定义好分组后,可设置其日志级别。比如将myGroup分组的日志级别设为 DEBUG,在application.properties中配置:

    1
    logging.level.myGroup=DEBUG
  • 日志分组与日志输出的关系:当设置好日志分组及级别后,组内 Logger 会按照该组级别进行日志输出控制。日志分组的配置会覆盖单个 Logger 的独立配置(如果之前有单独为某个 Logger 设置过级别,分组配置后会以分组级别为准)

结合日志滚动归档等功能

日志分组常与日志的其他功能配合使用,比如在生产环境中,结合日志滚动归档和切割功能。

  • 假设已对某个业务模块的日志进行分组,可进一步配置该组日志按天归档、按文件大小切割。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 日志存档文件名格式
    logging.logback.rollingpolicy.file-name-pattern=logs/myGroupLog.%d{yyyy-MM-dd}.%i.gz
    # 应用启动时不清除以前存档
    logging.logback.rollingpolicy.clean-history-on-start=false
    # 存档前每个日志文件最大大小为10MB
    logging.logback.rollingpolicy.max-file-size=10MB
    # 日志文件被删除之前容纳的最大大小(这里设为无限大)
    logging.logback.rollingpolicy.total-size-cap=0B
    # 日志文件保存的最大天数为7天
    logging.logback.rollingpolicy.max-history=7

日志输出

在 Spring Boot 中,日志输出相关内容涵盖日志格式、输出位置、日志级别控制以及与不同日志框架的集成等方面

Spring Boot 默认只把日志写在控制台,如果想额外记录到文件,可以在 application.properties中添加 logging.file.name or logging.file.path 配置项。

输出位置

  • 控制台输出:Spring Boot 默认将日志输出到控制台,在开发阶段方便快速查看应用运行状态和问题。开发者可通过配置日志级别来控制输出内容,比如设置为 DEBUG 级别可获取更详细信息用于调试。

  • 文件输出:要将日志输出到文件,可在配置文件(application.propertiesapplication.yaml)中进行配置。在application.properties中配置示例如下:

  • 属性设置

    • logging.file,设置文件,可以是绝对路径,也可以是相对路径。如:logging.file=my.log
    • logging.path,设置目录,会在该目录下创建spring.log`文件,并写入日志内容
    1
    2
    3
    # 配置日志输出到文件,指定文件路径
    logging.file.name=logs/app.log
    # 也可分开指定日志文件路径和名称

logging.file.path=logs/

# logging.file.name=app.log

# 只写名字,就生成到当前项目同位置的 demo.log

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
  
配置后,日志除了在控制台输出(若未关闭控制台输出配置),还会写入指定文件,便于后续查看和分析,尤其适用于生产环境。

| logging.file.name | logging.file.path | 示例 | 效果 |
| ----------------- | ----------------- | -------- | --------------------------------- |
| 未指定 | 未指定 | | 仅控制台输出 |
| 指定 | 未指定 | my.log | 写入指定文件。可以加路径 |
| 未指定 | 指定 | /var/log | 写入指定目录,文件名为 spring.log |
| 指定 | 指定 | | 以 logging.file.name 为准 |

> 注:二者不能同时使用,如若同时使用,则只有`logging.file`生效
> 默认情况下,日志文件的大小达到`10MB`时会切分一次,产生新的日志文件,默认级别为:`ERROR、WARN、INFO`

#### 实际场景

- **开发调试阶段**:将日志级别设为 DEBUG,通过控制台输出,能详细查看代码执行流程、变量值等信息,帮助快速定位问题。比如在开发一个业务方法时,在方法开始、关键逻辑分支、调用其他服务等位置添加 DEBUG 级别的日志,能清楚了解方法执行过程。
- **生产运行阶段**:一般将日志级别设为 INFO 或 WARN,重点关注关键业务信息和警告信息。同时将日志输出到文件,便于定期查看和分析应用运行情况。例如记录订单创建、支付成功等 INFO 级别的日志;对于可能存在风险的操作,如用户登录失败次数过多,记录 WARN 级别的日志。还可结合日志分析工具,从大量日志文件中挖掘有价值的信息,用于性能优化、故障排查等。



### 文件归档与滚动切割

1. 每天的日志应该独立分割出来存档。如果使用 logback(SpringBoot 默认整合),可以通过 application.properties/yaml 文件指定日志滚动规则。

2. 如果是其他日志系统,需要自行配置(添加 log4j2.xml 或 log4j2-spring.xml)

3. 支持的滚动规则设置如下



### 自定义日志系统

在 Spring Boot 应用中,文件归档与滚动切割是日志管理的重要功能,用于有效管理不断增长的日志文件,避免单个日志文件过大,同时方便对历史日志进行存档和查阅

归档:每天的日志都单独存到一个文档中

切割:指定每个日志文件固定大小,超过大小就切割成另一个文件

- **控制文件大小**:随着应用的持续运行,日志文件会不断增大。如果不加以控制,可能会占用大量磁盘空间,还会导致日志文件读取和分析困难。通过滚动切割,可将日志按照一定规则分割成多个较小的文件,比如按时间(每天、每周)或文件大小(达到一定字节数)进行切割。
- **便于管理和存档**:将日志按规则归档,能让不同时间段或不同条件下的日志分开保存。例如按天归档,每天的日志都在独立文件中,方便查找特定日期的日志记录,也便于对历史日志进行备份、清理等管理操作。



支持的滚动规则设置如下

| 配置项 | 描述 |
| ---------------------------------------------------- | ------------------------------------------------------------ |
| logging.logback.rollingpolicy.file-name-pattern | 日志存档的文件名格式(默认值:${LOG_FILE}.% d {yyyy-MM-dd}.% i.gz) |
| logging.logback.rollingpolicy.clean-history-on-start | 应用启动时是否清除以前存档(默认值:false) |
| logging.logback.rollingpolicy.max-file-size | 存档前,每个日志文件的最大大小(默认值:10MB) |
| logging.logback.rollingpolicy.total-size-cap | 日志文件被删除之前,可以容纳的最大大小(默认值:0B)。设置 1GB 则磁盘存储超过 1GB 日志后就会删除旧日志文件 |
| logging.logback.rollingpolicy.max-history | 日志文件保存的最大天数 (默认值:7) |



#### 基于 Logback 的配置(Spring Boot 默认整合)

- **按时间滚动切割**:在`application.properties`或`application.yaml`中进行配置。
在`application.properties`中配置按天滚动切割示例:

```properties
# 日志文件名称
logging.file.name=logs/app.log
# 日志滚动策略:按时间滚动
logging.logback.rollingpolicy.time-based=true
# 日志存档文件名格式,%d{yyyy-MM-dd}表示按日期替换
logging.logback.rollingpolicy.file-name-pattern=logs/app.%d{yyyy-MM-dd}.log.gz
# 保留的历史日志文件最大数量,这里设为30天
logging.logback.rollingpolicy.max-history=30

上述配置表示每天生成一个新的日志文件,旧的日志文件按app.日期.log.gz格式压缩存档,最多保留 30 天的历史日志文件

  • 按文件大小滚动切割:同样在配置文件中设置。 在application.properties中配置示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 日志文件名称
    logging.file.name=logs/app.log
    # 日志滚动策略:按文件大小滚动
    logging.logback.rollingpolicy.size-based=true
    # 每个日志文件的最大大小,这里设为10MB
    logging.logback.rollingpolicy.max-file-size=10MB
    # 日志存档文件名格式
    logging.logback.rollingpolicy.file-name-pattern=logs/app.%i.log.gz
    # 日志文件被删除之前容纳的最大大小,这里设为100MB
    logging.logback.rollingpolicy.total-size-cap=100MB

    此配置意味着当app.log文件大小达到 10MB 时,会进行滚动切割,生成新的日志文件,按顺序编号(app.1.log.gzapp.2.log.gz等),所有存档日志文件总大小达到 100MB 时,会删除最早的日志文件以控制占用空间。

其他日志系统的配置

如果使用 Log4j2 等其他日志系统,不能直接用上述针对 Logback 的配置方式。一般需要在log4j2.xmllog4j2-spring.xml配置文件中进行设置。以下是 Log4j2 按时间滚动切割的简单示例:

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
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app.%d{yyyy-MM-dd}.log.gz">
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="30">
<Delete basePath="logs" maxDepth="1">
<IfFileName glob="app.*.log.gz">
<IfAccumulatedFileCount exceeds="30" />
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="RollingFile" />
</Root>
</Loggers>
</Configuration>

上述配置中,<RollingFile>元素定义了滚动日志文件的相关设置,<Policies>内的<TimeBasedTriggeringPolicy>指定按时间滚动策略,<DefaultRolloverStrategy>设置了保留的最大历史文件数及删除策略等。

自定义日志系统

根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:

通常我们配置application.properties 就够了。当然也可以自定义。比如:

日志系统 自定义
Logback logback-spring.xml, logback-spring.groovy,logback.xml, logback.groovy
Log4j2 log4j2-spring.xml, log4j2.xml
JDK(Java Util Logging) logging.properties

如果可能,我们建议您在日志配置中使用 -spring 变量(例如,logback-spring.xml 而不是 logback.xml )。如果您使用标准配置文件,spring 无法完全控制日志初始化。

如果要自己写配置,配置文件名加上xx-spring.xml

Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot 可以为它添加一些 spring boot 特有的配置项 如果你即想完全掌控日志配置,但又不想用logback.xml作为Logback配置的名字,application.yml可以通过logging.config属性指定自定义的名字:

1
logging.config=classpath:logging-config.xml

虽然一般并不需要改变配置文件的名字,但是如果你想针对不同运行时Profile使用不同的日志配置,这个功能会很有用。 一般不需要这个属性,而是直接在logback-spring.xml中使用springProfile配置,不需要logging.config指定不同环境使用不同配置文件。springProfile配置在下面介绍。

Logback 根节点<configuration>

在 Logback 日志框架的配置中,<configuration> 是根节点,它包含的一些属性可以控制 Logback 的整体行为,同时它还有多个子节点用于进一步细化日志配置。以下是对这部分内容的详细讲解:

根节点 <configuration> 包含的属性

  1. scan 属性

    • 作用:决定当配置文件发生变化时,Logback 是否重新加载配置。如果设置为 true ,一旦配置文件(比如 logback - spring.xml 等)的内容被修改,Logback 会自动检测到并重新加载配置,新的配置会立即生效,无需重启应用程序。
    • 使用场景:在开发阶段非常实用,开发人员频繁调整日志配置(如修改日志级别、输出格式等)时,不用反复重启应用就能看到配置修改后的效果,提高开发效率。
    • 默认值true
  2. scanPeriod 属性

    • 作用:指定 Logback 检查配置文件是否有修改的时间间隔。只有当 scan 属性为 true 时,这个属性才会生效。如果不指定时间单位,默认以毫秒为单位。
    • 使用场景:如果希望更及时地检测到配置文件的变化,可以将时间间隔设置得短一些,比如设置为 5000 (表示 5 秒),能让 Logback 每 5 秒检查一次配置文件;若不想过于频繁地检查(频繁检查会消耗一定系统资源),可以设置较长时间间隔,如默认的 1 分钟(即 60000 毫秒 )。
    • 默认值:1 分钟(60000 毫秒 )。
  3. debug 属性

    • 作用:当设置为 true 时,Logback 会打印内部日志信息,这些信息能帮助开发人员了解 Logback 的运行状态,比如日志加载过程、各个组件的初始化情况、配置解析过程中是否存在问题等。

    • 使用场景:在排查 Logback 配置问题或调试 Logback 相关功能时很有用。例如,发现日志输出不符合预期,开启 debug 模式后,通过查看内部日志信息,能定位是配置文件解析错误,还是某些组件初始化失败等问题。

    • 默认值false

根节点 <configuration> 的子节点

<configuration> 根节点有多个子节点,每个子节点都有特定的功能,后续会详细介绍,常见的子节点包括:

  1. <appender> 子节点

    • 作用:用来格式化日志输出节点,有俩个属性 name 和 class,class 用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。可以用于定义日志输出的目的地,比如控制台(ConsoleAppender)、文件(FileAppender)、数据库等。可以配置不同的 Appender 来实现日志的多目的地输出,例如同时将日志输出到控制台和文件中。

    • 示例:定义一个将日志输出到控制台的 Appender:

      1
      2
      3
      4
      5
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
      </encoder>
      </appender>

      上述配置中,name 属性给 Appender 命名为 STDOUTclass 指定了 Appender 的类型为控制台输出类型,<encoder> 标签内定义了日志输出的格式,表示对日志进行编码

      • %d{HH: mm:ss.SSS}——日志输出时间
      • %thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
      • %-5level——日志级别,并且使用5个字符靠左对齐
      • %logger{36}——日志输出者的名字
      • %msg——日志消息
      • %n——平台的换行符
  2. <logger>子节点

    • 作用:用于设置特定包或类的日志级别,它可以覆盖根 Logger 的级别设置。通过 <appender> 节点,可以对项目中不同模块、包的日志级别进行精细控制。仅有一个name属性,一个可选的level和一个可选的addtivity属性。

      • name:用来指定受此 logger 约束的某一个包或者具体的某一个类。
      • level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值 INHERITED 或者同义词 NULL ,代表强制执行上级的级别。如果未设置此属性,那么当前 logger 将会继承上级的级别。
      • addtivity:是否向上级loger传递打印信息。默认是true。
    • 示例:设置 com.example.service 包下所有类的日志级别为 DEBUG:

      1
      <logger name="com.example.service" level="DEBUG" />

      这里 name 属性指定了包名,level 属性设置了日志级别。

  3. <root> 子节点

    • 介绍:<root>节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。level 用来设置打印级别,大小写无关,标识这个 appender 将会添加到这个loger。

    • 作用:定义根 Logger,它是所有其他 Logger 的父 Logger,设置根 Logger 的级别会影响到未单独设置级别的 Logger。如果某个 Logger 没有显式设置级别,就会继承根 Logger 的级别。

    • 示例:将根 Logger 的级别设置为 INFO

      1
      2
      3
      <root level="INFO">
      <appender-ref ref="STDOUT" />
      </root>

      上述配置中,level 属性设置了根 Logger 级别为 INFO,并通过 `标签引用了前面定义的名为STDOUT` 的 Appender,意味着根 Logger 的日志会输出到控制台。

  4. <turboFilter> 子节点

    • 作用:用于实现更高级的日志过滤功能。TurboFilter 可以在日志事件被处理之前进行过滤,根据自定义的规则决定是否允许该日志事件继续被处理和输出。

    • 示例:定义一个简单的 TurboFilter(具体实现类需自定义):

      1
      2
      3
      <turboFilter class="com.example.MyTurboFilter">
      <option name="param1" value="value1" />
      </turboFilter>

      这里 class 属性指定了 TurboFilter 的实现类,`` 标签可以传递一些参数给 TurboFilter。

  5. <contextListener> 子节点

    • 作用:用于在 Logback 的上下文(Context)发生某些事件时执行特定的逻辑。比如在 Logback 初始化完成、配置重新加载等事件发生时,可以通过 ContextListener 来执行一些自定义操作。

    • 示例:定义一个 ContextListener(具体实现类需自定义)

      1
      <contextListener class="com.example.MyContextListener" />

      这里 class 属性指定了 ContextListener 的实现类。

  6. <contextName> 设置上下文名称

    • 作用:在 Logback 中,<contextName> 用于设置日志上下文(Logger Context)的名称。每个 Logger 都属于一个特定的上下文,默认情况下,这个上下文名称是 “default”。通过自定义上下文名称,可以实现一些功能。一旦设置,不能修改,可以通过%contextName来打印日志上下文名称,一般来说我们不用这个属性,可有可无。

    • 关键特性

      • 唯一性:每个 Logger 上下文必须有唯一的名称。若多个应用使用相同名称,可能导致日志配置冲突。
      • 不可修改:上下文名称一旦在配置文件中设置,运行时无法修改。如需动态调整,需通过编程方式(如 Java 代码)重新初始化 Logger 上下文。
      • 与 Spring Boot 集成:Spring Boot 默认使用 spring.application.name 作为上下文名称(通过 LogbackLoggingSystem 自动配置),无需手动设置。例如:
    • 示例

      logback.xml 中设置上下文名称

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      <configuration>
      <!-- 设置上下文名称为 myApp -->
      <contextName>myApp</contextName>

      <!-- 配置 Appender,在日志格式中包含 %contextName -->
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss} [%contextName] [%thread] %-5level %logger{36} - %msg%n</pattern>
      </encoder>
      </appender>

      <root level="INFO">
      <appender-ref ref="STDOUT" />
      </root>
      </configuration>

      输出示例:

      1
      2025-05-28 10:30:00 [myApp] [main] INFO  com.example.MyService - 服务启动成功