此版本仍在开发中,尚未被视为稳定版本。如需最新稳定版本,请使用 Spring Boot 4.0.4!spring-doc.cadn.net.cn

日志记录

Spring Boot 使用 Commons Logging 进行所有内部日志记录,但底层日志实现保持开放。 默认为 Java Util LoggingLog4j2Logback 提供了配置。 在每种情况下,日志记录器均已预先配置为使用控制台输出,并可选择启用文件输出。spring-doc.cadn.net.cn

默认情况下,如果使用 Spring Boot Starter,则日志框架采用 Logback。 同时,还包含了适当的 Logback 路由配置,以确保使用 Java Util Logging、Commons Logging、Log4J 或 SLF4J 的依赖库均能正常工作。spring-doc.cadn.net.cn

Java 有许多可用的日志框架。 如果上面的列表看起来令人困惑,请不必担心。 通常,您无需更改日志依赖项,Spring Boot 的默认配置即可正常工作。
当您将应用程序部署到 Servlet 容器或应用服务器时,使用 Java Util Logging API 执行的日志记录不会被路由到您的应用程序日志中。 这可防止容器本身或其他已部署到该容器中的应用程序所执行的日志记录出现在您的应用程序日志中。

日志格式

Spring Boot 的默认日志输出类似于以下示例:spring-doc.cadn.net.cn

2026-03-20T01:06:12.428Z  INFO 105652 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : Starting MyApplication using Java 25.0.2 with PID 105652 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2026-03-20T01:06:12.442Z  INFO 105652 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : No active profile set, falling back to 1 default profile: "default"
2026-03-20T01:06:15.526Z  INFO 105652 --- [myapp] [           main] o.s.boot.tomcat.TomcatWebServer          : Tomcat initialized with port 8080 (http)
2026-03-20T01:06:15.558Z  INFO 105652 --- [myapp] [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2026-03-20T01:06:15.558Z  INFO 105652 --- [myapp] [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/11.0.18]
2026-03-20T01:06:15.690Z  INFO 105652 --- [myapp] [           main] b.w.c.s.WebApplicationContextInitializer : Root WebApplicationContext: initialization completed in 3061 ms
2026-03-20T01:06:17.314Z  INFO 105652 --- [myapp] [           main] o.s.boot.tomcat.TomcatWebServer          : Tomcat started on port 8080 (http) with context path '/'
2026-03-20T01:06:17.334Z  INFO 105652 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : Started MyApplication in 6.437 seconds (process running for 7.611)
2026-03-20T01:06:17.391Z  INFO 105652 --- [myapp] [ionShutdownHook] o.s.boot.tomcat.GracefulShutdown         : Commencing graceful shutdown. Waiting for active requests to complete
2026-03-20T01:06:17.422Z  INFO 105652 --- [myapp] [tomcat-shutdown] o.s.boot.tomcat.GracefulShutdown         : Graceful shutdown complete

以下项目将被输出:spring-doc.cadn.net.cn

Logback 没有 FATAL 级别。 它被映射为 ERROR
如果您有一个 spring.application.name 属性,但不希望它被记录,可以将 logging.include-application-name 设置为 false
如果您有一个 spring.application.group 属性,但不希望它被记录,可以将 logging.include-application-group 设置为 false
有关关联ID的更多详细信息,请参阅此文档

控制台输出

默认日志配置会在写入日志消息时将其回显到控制台。 默认情况下,会记录 ERROR 级、WARN 级和 INFO 级日志消息。 您还可以通过使用 --debug 标志启动应用程序来启用“调试”模式。spring-doc.cadn.net.cn

$ java -jar myapp.jar --debug
您还可以在 application.properties 中指定 debug=true

启用调试模式后,部分核心记录器(嵌入式容器、Hibernate 和 Spring Boot)将被配置为输出更多信息。 启用调试模式 并不会 将您的应用程序配置为以 DEBUG 级别记录所有消息。spring-doc.cadn.net.cn

或者,您可以通过使用 --trace 标志(或在您的 application.properties 中使用 trace=true)启动应用程序来启用“跟踪”模式。 启用该模式后,将为一组核心记录器(嵌入式容器、Hibernate 模式生成以及整个 Spring 技术栈)启用跟踪日志记录。spring-doc.cadn.net.cn

如果您想禁用基于控制台的日志记录,可以将 logging.console.enabled 属性设置为 falsespring-doc.cadn.net.cn

彩色编码输出

如果您的终端支持 ANSI,将使用彩色输出以提高可读性。 您可以将 spring.output.ansi.enabled 设置为一个受支持的值,以覆盖自动检测功能。spring-doc.cadn.net.cn

颜色编码通过使用 %clr 转换字进行配置。 在最简单的情况下,转换器会根据日志级别为输出着色,如下例所示:spring-doc.cadn.net.cn

%clr(%5p)

下表描述了日志级别与颜色的映射关系:spring-doc.cadn.net.cn

级别 颜色

FATALspring-doc.cadn.net.cn

红色spring-doc.cadn.net.cn

ERRORspring-doc.cadn.net.cn

红色spring-doc.cadn.net.cn

WARNspring-doc.cadn.net.cn

黄色spring-doc.cadn.net.cn

INFOspring-doc.cadn.net.cn

绿色spring-doc.cadn.net.cn

DEBUGspring-doc.cadn.net.cn

绿色spring-doc.cadn.net.cn

TRACEspring-doc.cadn.net.cn

绿色spring-doc.cadn.net.cn

或者,您可以通过将它们作为转换的选项提供来指定应使用的颜色和样式。 例如,要使文本变为黄色并加粗,请使用以下设置:spring-doc.cadn.net.cn

%clr(%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}){yellow,bold}

以下文本颜色是支持的:spring-doc.cadn.net.cn

以下支持的背景颜色有:spring-doc.cadn.net.cn

以下样式是受支持的:spring-doc.cadn.net.cn

文件输出

默认情况下,Spring Boot 仅向控制台输出日志,不会写入日志文件。 如果您希望在控制台输出之外还写入日志文件,则需要设置一个 logging.file.namelogging.file.path 属性(例如,在您的 application.properties 中)。 如果同时设置了这两个属性,则 logging.file.path 将被忽略,仅使用 logging.file.namespring-doc.cadn.net.cn

下表展示了如何将 logging.* 属性组合使用:spring-doc.cadn.net.cn

表 1. 日志记录属性
logging.file.name logging.file.path 描述

spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

仅控制台日志记录。spring-doc.cadn.net.cn

特定文件(例如,my.logspring-doc.cadn.net.cn

spring-doc.cadn.net.cn

写入由 logging.file.name 指定的位置。 该位置可以是绝对路径,也可以是相对于当前目录的相对路径。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

特定目录(例如,/var/logspring-doc.cadn.net.cn

spring.log 写入由 logging.file.path 指定的目录。 该目录可以是绝对路径,也可以是相对于当前目录的路径。spring-doc.cadn.net.cn

特定文件spring-doc.cadn.net.cn

特定目录spring-doc.cadn.net.cn

logging.file.name 指定的位置写入内容,并忽略 logging.file.path。 该位置可以是绝对路径,也可以是相对于当前目录的相对路径。spring-doc.cadn.net.cn

日志文件在达到 10 MB 时会进行轮转;与控制台输出一样,默认情况下会记录 ERROR 级、WARN 级和 INFO 级日志消息。 请注意,Log4J2 在此类配置下需要将级别设置为 logging.file.pathspring-doc.cadn.net.cn

日志记录属性与实际的日志记录基础设施相互独立。 因此,特定配置项(例如 Logback 的 logback.configurationFile)不由 Spring Boot 管理。

文件轮转

如果您使用的是 Logback 或 Log4J2,可以通过您的 application.propertiesapplication.yaml 文件微调日志轮转设置。 对于其他所有日志系统,您需要自行配置轮转设置。spring-doc.cadn.net.cn

Logback 支持以下轮转策略属性:spring-doc.cadn.net.cn

名称 描述

logging.logback.rollingpolicy.file-name-patternspring-doc.cadn.net.cn

用于创建日志归档文件的文件名模式。spring-doc.cadn.net.cn

logging.logback.rollingpolicy.clean-history-on-startspring-doc.cadn.net.cn

应用启动时是否应执行日志归档清理。spring-doc.cadn.net.cn

logging.logback.rollingpolicy.max-file-sizespring-doc.cadn.net.cn

归档前日志文件的最大大小。spring-doc.cadn.net.cn

logging.logback.rollingpolicy.total-size-capspring-doc.cadn.net.cn

日志归档文件在被删除前可占用的最大大小。spring-doc.cadn.net.cn

logging.logback.rollingpolicy.max-historyspring-doc.cadn.net.cn

要保留的归档日志文件的最大数量(默认为 7)。spring-doc.cadn.net.cn

如果你使用的是 Log4j2,以下旋转策略属性可用:spring-doc.cadn.net.cn

名称 描述

logging.log4j2.rollingpolicy.file-name-patternspring-doc.cadn.net.cn

用于创建日志归档文件的文件名模式。spring-doc.cadn.net.cn

logging.log4j2.rollingpolicy.max-file-sizespring-doc.cadn.net.cn

日志文件在被归档前的最大大小(默认为10MB)。spring-doc.cadn.net.cn

logging.log4j2.rollingpolicy.max-historyspring-doc.cadn.net.cn

要保留的归档日志文件的最大数量(默认为 7)。spring-doc.cadn.net.cn

logging.log4j2.rollingpolicy.strategyspring-doc.cadn.net.cn

滚动策略(默认为“size”)。spring-doc.cadn.net.cn

logging.log4j2.rollingpolicy.cronspring-doc.cadn.net.cn

当策略为“cron”时使用的 Cron 表达式(默认为每天午夜)。spring-doc.cadn.net.cn

logging.log4j2.rollingpolicy.time-intervalspring-doc.cadn.net.cn

基于时间的触发间隔,当策略为 'time' 或 'size-and-time' 时(默认为 1)。spring-doc.cadn.net.cn

logging.log4j2.rollingpolicy.time-modulatespring-doc.cadn.net.cn

当策略基于时间时,是否将下一个悬停时间对齐到间隔的顶部(默认值为false)。spring-doc.cadn.net.cn

日志级别

所有受支持的日志系统均可通过使用 logging.level.<logger-name>=<level>(其中 level 为 TRACE、DEBUG、INFO、WARN、ERROR、FATAL 或 OFF 之一)在 Spring Environment(例如,在 application.properties 中)中设置日志记录器级别。 可通过使用 logging.level.root 来配置 root 日志记录器。spring-doc.cadn.net.cn

以下示例展示了 application.properties 中可能的日志记录设置:spring-doc.cadn.net.cn

logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
logging:
  level:
    root: "warn"
    org.springframework.web: "debug"
    org.hibernate: "error"

还可以通过环境变量来设置日志级别。 例如,LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG 将把 org.springframework.web 设置为 DEBUGspring-doc.cadn.net.cn

上述方法仅适用于包级别日志记录。 由于宽松绑定始终将环境变量转换为小写形式,因此无法通过这种方式为单个类配置日志记录。 如果您需要为某个类配置日志记录,可以使用SPRING_APPLICATION_JSON 变量。

日志组

通常,将相关的记录器(logger)分组很有用,这样便可以同时对它们进行配置。 例如,您可能经常需要更改所有与 Tomcat 相关的记录器的日志级别,但很难记住顶层包的名称。spring-doc.cadn.net.cn

为帮助实现这一点,Spring Boot 允许您在 Spring Environment 中定义日志记录组。 例如,您可以通过在 application.properties 中添加以下配置来定义一个 “tomcat” 组:spring-doc.cadn.net.cn

logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging:
  group:
    tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"

定义后,您可以通过一行代码更改组内所有记录器的日志级别:spring-doc.cadn.net.cn

logging.level.tomcat=trace
logging:
  level:
    tomcat: "trace"

Spring Boot 包含以下预定义的日志组,可直接开箱即用:spring-doc.cadn.net.cn

名称 日志记录器

Webspring-doc.cadn.net.cn

org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeansspring-doc.cadn.net.cn

SQLspring-doc.cadn.net.cn

org.springframework.jdbc.core, org.hibernate.SQL, LoggerListenerspring-doc.cadn.net.cn

使用日志关闭钩子

为在应用程序终止时释放日志资源,Spring 提供了一个关闭钩子(shutdown hook),该钩子会在 JVM 退出时触发日志系统的清理操作。 除非您的应用程序以 WAR 文件形式部署,否则该关闭钩子会自动注册。 如果您的应用程序具有复杂的上下文层次结构,则该关闭钩子可能无法满足您的需求。 若确实如此,请禁用该关闭钩子,并直接考察底层日志系统所提供的相关选项。 例如,Logback 提供了 上下文选择器(context selectors),允许每个 Logger 在其自身的上下文中创建。 您可以使用 logging.register-shutdown-hook 属性来禁用关闭钩子。 将其设置为 false 将禁用该钩子的注册。 您可以在 application.propertiesapplication.yaml 文件中设置该属性:spring-doc.cadn.net.cn

logging.register-shutdown-hook=false
logging:
  register-shutdown-hook: false

自定义日志配置

通过在类路径中引入相应的库,可启用各种日志系统;此外,还可通过在类路径根目录下或以下 Spring Environment 属性所指定的位置提供合适的配置文件,进一步自定义日志系统:logging.configspring-doc.cadn.net.cn

您可以通过使用 org.springframework.boot.logging.LoggingSystem 系统属性,强制 Spring Boot 使用特定的日志系统。 该属性值应为某个 LoggingSystem 实现类的完全限定类名。 您还可以通过将该属性值设为 none,完全禁用 Spring Boot 的日志配置。spring-doc.cadn.net.cn

由于日志系统是在 创建 ApplicationContext 之前初始化的,因此无法通过 Spring @PropertySources@Configuration 文件来控制日志记录。 更改日志系统或完全禁用日志的唯一方法是通过系统属性。

根据您所使用的日志系统,将加载以下文件:spring-doc.cadn.net.cn

日志系统 自定义

Logbackspring-doc.cadn.net.cn

logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovyspring-doc.cadn.net.cn

Log4j2spring-doc.cadn.net.cn

log4j2-spring.xml or log4j2.xmlspring-doc.cadn.net.cn

JDK(Java Util 日志记录)spring-doc.cadn.net.cn

logging.propertiesspring-doc.cadn.net.cn

在可能的情况下,我们建议您在日志配置中使用 -spring 变体(例如,使用 logback-spring.xml 而非 logback.xml)。 如果您使用标准的配置位置,Spring 将无法完全控制日志的初始化过程。
Java Util Logging 存在已知的类加载问题,这会在以“可执行 JAR”方式运行时引发问题。 我们建议您尽可能避免在以“可执行 JAR”方式运行时使用它。

为便于自定义,Spring Environment 中的其他一些属性会被传递至系统属性。 这使得日志系统配置能够使用这些属性。例如,在 application.propertiesLOGGING_FILE_NAME 中将 logging.file.name 设为环境变量,将导致设置 LOG_FILE 系统属性。 被传递的属性如下表所示:spring-doc.cadn.net.cn

Spring 环境 系统属性 注释

logging.exception-conversion-wordspring-doc.cadn.net.cn

LOG_EXCEPTION_CONVERSION_WORDspring-doc.cadn.net.cn

记录异常时使用的转换词。spring-doc.cadn.net.cn

logging.file.namespring-doc.cadn.net.cn

LOG_FILEspring-doc.cadn.net.cn

如果已定义,则在默认日志配置中使用。spring-doc.cadn.net.cn

logging.file.pathspring-doc.cadn.net.cn

LOG_PATHspring-doc.cadn.net.cn

如果已定义,则在默认日志配置中使用。spring-doc.cadn.net.cn

logging.pattern.consolespring-doc.cadn.net.cn

CONSOLE_LOG_PATTERNspring-doc.cadn.net.cn

控制台(stdout)上使用的日志模式。spring-doc.cadn.net.cn

logging.pattern.dateformatspring-doc.cadn.net.cn

LOG_DATEFORMAT_PATTERNspring-doc.cadn.net.cn

日志日期格式的追加器模式。spring-doc.cadn.net.cn

logging.charset.consolespring-doc.cadn.net.cn

CONSOLE_LOG_CHARSETspring-doc.cadn.net.cn

控制台日志记录所使用的字符集。spring-doc.cadn.net.cn

logging.threshold.consolespring-doc.cadn.net.cn

CONSOLE_LOG_THRESHOLDspring-doc.cadn.net.cn

用于控制台日志记录的日志级别阈值。spring-doc.cadn.net.cn

logging.pattern.filespring-doc.cadn.net.cn

FILE_LOG_PATTERNspring-doc.cadn.net.cn

在文件中使用的日志模式(如果启用了 LOG_FILE)。spring-doc.cadn.net.cn

logging.charset.filespring-doc.cadn.net.cn

FILE_LOG_CHARSETspring-doc.cadn.net.cn

用于文件日志记录的字符编码(如果启用了 LOG_FILE)。spring-doc.cadn.net.cn

logging.threshold.filespring-doc.cadn.net.cn

FILE_LOG_THRESHOLDspring-doc.cadn.net.cn

用于文件日志记录的日志级别阈值。spring-doc.cadn.net.cn

logging.pattern.levelspring-doc.cadn.net.cn

LOG_LEVEL_PATTERNspring-doc.cadn.net.cn

渲染日志级别时所使用的格式(默认为 %5p)。spring-doc.cadn.net.cn

logging.structured.format.consolespring-doc.cadn.net.cn

CONSOLE_LOG_STRUCTURED_FORMATspring-doc.cadn.net.cn

用于控制台日志记录的结构化日志格式。spring-doc.cadn.net.cn

logging.structured.format.filespring-doc.cadn.net.cn

FILE_LOG_STRUCTURED_FORMATspring-doc.cadn.net.cn

用于文件日志记录的结构化日志格式。spring-doc.cadn.net.cn

PIDspring-doc.cadn.net.cn

PIDspring-doc.cadn.net.cn

当前进程 ID(如果可能则自动发现;若操作系统环境变量中尚未定义,则执行此操作)。spring-doc.cadn.net.cn

如果使用 Logback,则以下属性也会被传递:spring-doc.cadn.net.cn

Spring 环境 系统属性 注释

logging.logback.rollingpolicy.file-name-patternspring-doc.cadn.net.cn

LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERNspring-doc.cadn.net.cn

滚动日志文件名的命名模式(默认为 ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz)。spring-doc.cadn.net.cn

logging.logback.rollingpolicy.clean-history-on-startspring-doc.cadn.net.cn

LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_STARTspring-doc.cadn.net.cn

是否在启动时清理归档日志文件。spring-doc.cadn.net.cn

logging.logback.rollingpolicy.max-file-sizespring-doc.cadn.net.cn

LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZEspring-doc.cadn.net.cn

最大日志文件大小。spring-doc.cadn.net.cn

logging.logback.rollingpolicy.total-size-capspring-doc.cadn.net.cn

LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAPspring-doc.cadn.net.cn

要保留的日志备份的总大小。spring-doc.cadn.net.cn

logging.logback.rollingpolicy.max-historyspring-doc.cadn.net.cn

LOGBACK_ROLLINGPOLICY_MAX_HISTORYspring-doc.cadn.net.cn

要保留的归档日志文件的最大数量。spring-doc.cadn.net.cn

所有受支持的日志系统在解析其配置文件时均可参考系统属性。 有关示例,请参阅 spring-boot.jar 中的默认配置:spring-doc.cadn.net.cn

如果要在日志属性中使用占位符,则应使用 Spring Boot 的语法,而非底层框架的语法。 特别需要注意的是,如果您使用 Logback,则应在属性名称与其默认值之间使用 : 作为分隔符,而不要使用 :-spring-doc.cadn.net.cn

您可以通过仅重写 LOG_LEVEL_PATTERN(或 Logback 中的 logging.pattern.level)来向日志行添加 MDC 及其他临时内容。 例如,如果您使用 logging.pattern.level=user:%X{user} %5p,则默认日志格式将包含一个名为“user”的 MDC 条目(如果该条目存在),如下例所示。spring-doc.cadn.net.cn

2019-08-30 12:30:04.031 user:someone INFO 22174 --- [  nio-8080-exec-0] demo.Controller
Handling authenticated request

结构化日志记录

结构化日志记录是一种将日志输出以明确定义的、通常为机器可读的格式进行写入的技术。 Spring Boot 支持结构化日志记录,并开箱即用地支持以下 JSON 格式:spring-doc.cadn.net.cn

要启用结构化日志记录,请将属性 logging.structured.format.console(用于控制台输出)或 logging.structured.format.file(用于文件输出)设置为所要使用的格式的 ID。spring-doc.cadn.net.cn

如果您正在使用 自定义日志配置,请更新您的配置以支持 CONSOLE_LOG_STRUCTURED_FORMATFILE_LOG_STRUCTURED_FORMAT 系统属性。 以 CONSOLE_LOG_STRUCTURED_FORMAT 为例:spring-doc.cadn.net.cn

<!-- replace your encoder with StructuredLogEncoder -->
<encoder class="org.springframework.boot.logging.logback.StructuredLogEncoder">
	<format>${CONSOLE_LOG_STRUCTURED_FORMAT}</format>
	<charset>${CONSOLE_LOG_CHARSET}</charset>
</encoder>

您还可以参考 Spring Boot 中包含的默认配置:spring-doc.cadn.net.cn

<!-- replace your PatternLayout with StructuredLogLayout -->
<StructuredLogLayout format="${sys:CONSOLE_LOG_STRUCTURED_FORMAT}" charset="${sys:CONSOLE_LOG_CHARSET}"/>

您还可以参考 Spring Boot 中包含的默认配置:spring-doc.cadn.net.cn

弹性通用模式

Elastic 通用模式 是一种基于 JSON 的日志格式。spring-doc.cadn.net.cn

要启用 Elastic 通用模式(ECS)日志格式,请将相应的 format 属性设置为 ecsspring-doc.cadn.net.cn

logging.structured.format.console=ecs
logging.structured.format.file=ecs
logging:
  structured:
    format:
      console: ecs
      file: ecs

一条日志记录如下所示:spring-doc.cadn.net.cn

{"@timestamp":"2024-01-01T10:15:00.067462556Z","log":{"level":"INFO","logger":"org.example.Application"},"process":{"pid":39599,"thread":{"name":"main"}},"service":{"name":"simple"},"message":"No active profile set, falling back to 1 default profile: \"default\"","ecs":{"version":"8.11"}}

此格式还会将MDC中包含的每个键值对添加到JSON对象中。 您还可以使用SLF4J 流式日志记录API,通过addKeyValue方法将键值对添加到已记录的JSON对象中。spring-doc.cadn.net.cn

可使用 logging.structured.ecs.service 属性来自定义 service 的值:spring-doc.cadn.net.cn

logging.structured.ecs.service.name=MyService
logging.structured.ecs.service.version=1
logging.structured.ecs.service.environment=Production
logging.structured.ecs.service.node-name=Primary
logging:
  structured:
    ecs:
      service:
        name: MyService
        version: 1.0
        environment: Production
        node-name: Primary
若未指定,logging.structured.ecs.service.name 将默认为 spring.application.name
若未指定,logging.structured.ecs.service.version 将默认为 spring.application.version

Graylog 扩展日志格式(GELF)

Graylog 扩展日志格式 是 Graylog 日志分析平台所使用的基于 JSON 的日志格式。spring-doc.cadn.net.cn

要启用 Graylog 扩展日志格式,请将相应的 format 属性设置为 gelfspring-doc.cadn.net.cn

logging.structured.format.console=gelf
logging.structured.format.file=gelf
logging:
  structured:
    format:
      console: gelf
      file: gelf

一条日志记录如下所示:spring-doc.cadn.net.cn

{"version":"1.1","short_message":"No active profile set, falling back to 1 default profile: \"default\"","timestamp":1725958035.857,"level":6,"_level_name":"INFO","_process_pid":47649,"_process_thread_name":"main","_log_logger":"org.example.Application"}

此格式还会将MDC中包含的每个键值对添加到JSON对象中。 您还可以使用SLF4J 流式日志记录API,通过addKeyValue方法将键值对添加到已记录的JSON对象中。spring-doc.cadn.net.cn

可使用 logging.structured.gelf 属性自定义多个字段:spring-doc.cadn.net.cn

logging.structured.gelf.host=MyService
logging.structured.gelf.service.version=1
logging:
  structured:
    gelf:
      host: MyService
      service:
        version: 1.0
若未指定,logging.structured.gelf.host 将默认为 spring.application.name
若未指定,logging.structured.gelf.service.version 将默认为 spring.application.version

Logstash JSON 格式

Logstash JSON 格式 是一种基于 JSON 的日志记录格式。spring-doc.cadn.net.cn

要启用 Logstash JSON 日志格式,请将相应的 format 属性设置为 logstashspring-doc.cadn.net.cn

logging.structured.format.console=logstash
logging.structured.format.file=logstash
logging:
  structured:
    format:
      console: logstash
      file: logstash

一条日志记录如下所示:spring-doc.cadn.net.cn

{"@timestamp":"2024-01-01T10:15:00.111037681+02:00","@version":"1","message":"No active profile set, falling back to 1 default profile: \"default\"","logger_name":"org.example.Application","thread_name":"main","level":"INFO","level_value":20000}

此格式还会将MDC中包含的每个键值对添加到JSON对象中。 您还可以使用SLF4J 流式日志记录API,通过addKeyValue方法将键值对添加到已记录的JSON对象中。spring-doc.cadn.net.cn

如果您添加了标记,这些标记将以 JSON 中的 tags 字符串数组形式显示。spring-doc.cadn.net.cn

自定义结构化日志JSON

Spring Boot 会尝试为结构化日志输出的 JSON 名称和值选择合理的默认设置。 然而,有时你可能需要根据自身需求对 JSON 做一些细微调整。 例如,你可能希望修改某些字段名称,以匹配日志采集系统所期望的格式。 你也可能希望过滤掉某些字段,因为它们对你而言并无实际用途。spring-doc.cadn.net.cn

以下属性允许您更改结构化日志 JSON 的写入方式:spring-doc.cadn.net.cn

属性 描述

logging.structured.json.include & logging.structured.json.excludespring-doc.cadn.net.cn

从 JSON 中过滤特定路径spring-doc.cadn.net.cn

logging.structured.json.renamespring-doc.cadn.net.cn

重命名 JSON 中的特定成员spring-doc.cadn.net.cn

logging.structured.json.addspring-doc.cadn.net.cn

向 JSON 添加额外的成员spring-doc.cadn.net.cn

例如,以下操作将排除 log.level、将 process.id 重命名为 procid,并添加一个固定的 corpname 字段:spring-doc.cadn.net.cn

logging.structured.json.exclude=log.level
logging.structured.json.rename.process.id=procid
logging.structured.json.add.corpname=mycorp
logging:
  structured:
    json:
      exclude: log.level
      rename:
        process.id: procid
      add:
        corpname: mycorp
如需进行更高级的自定义,您可以使用 StructuredLoggingJsonMembersCustomizer 接口。 您可以通过 logging.structured.json.customizer 属性引用一个或多个实现。 您还可以在 META-INF/spring.factories 文件中列出这些实现来声明它们。

自定义结构化日志堆栈跟踪

每当记录带有异常的消息时,JSON 输出中都会包含完整的堆栈跟踪信息。 此类信息可能给您的日志采集系统带来较高的处理开销,因此您可能需要调整堆栈跟踪信息的打印方式。spring-doc.cadn.net.cn

为此,您可以使用以下一个或多个属性:spring-doc.cadn.net.cn

属性 描述

logging.structured.json.stacktrace.rootspring-doc.cadn.net.cn

使用 last 表示最后打印根项(与 Java 相同),或使用 first 表示首先打印根项。spring-doc.cadn.net.cn

logging.structured.json.stacktrace.max-lengthspring-doc.cadn.net.cn

应打印的最大长度spring-doc.cadn.net.cn

logging.structured.json.stacktrace.max-throwable-depthspring-doc.cadn.net.cn

每条堆栈跟踪中要打印的最大帧数(包括公共帧和被抑制的帧)spring-doc.cadn.net.cn

logging.structured.json.stacktrace.include-common-framesspring-doc.cadn.net.cn

是否应包含或移除通用框架spring-doc.cadn.net.cn

logging.structured.json.stacktrace.include-hashesspring-doc.cadn.net.cn

是否应包含堆栈跟踪的哈希值spring-doc.cadn.net.cn

例如,以下配置将使用根级堆栈跟踪、限制其长度,并包含哈希值。spring-doc.cadn.net.cn

logging.structured.json.stacktrace.root=first
logging.structured.json.stacktrace.max-length=1024
logging.structured.json.stacktrace.include-common-frames=true
logging.structured.json.stacktrace.include-hashes=true
logging:
  structured:
    json:
      stacktrace:
        root: first
        max-length: 1024
        include-common-frames: true
        include-hashes: true

如果您需要完全控制堆栈跟踪信息的打印方式,可以将 logging.structured.json.stacktrace.printer 设置为某个 StackTracePrinter 实现类的名称。 您也可以将其设置为 logging-system,以强制使用常规日志系统的堆栈跟踪输出。spring-doc.cadn.net.cn

您的 StackTracePrinter 实现还可以包含一个构造函数参数,用于接收一个 StandardStackTracePrinter,以便根据属性创建的堆栈跟踪打印器进一步自定义其行为。spring-doc.cadn.net.cn

支持其他结构化日志格式

Spring Boot 中的结构化日志支持具有可扩展性,允许您定义自己的自定义格式。 为此,请实现 StructuredLogFormatter 接口。当使用 Logback 时,泛型类型参数必须为 ILoggingEvent;当使用 Log4j2 时,则必须为 LogEvent(这意味着您的实现与特定的日志系统绑定)。 随后,您的实现将接收日志事件作为输入,并返回待记录的 String,如下例所示:spring-doc.cadn.net.cn

import ch.qos.logback.classic.spi.ILoggingEvent;

import org.springframework.boot.logging.structured.StructuredLogFormatter;

class MyCustomFormat implements StructuredLogFormatter<ILoggingEvent> {

	@Override
	public String format(ILoggingEvent event) {
		return "time=" + event.getInstant() + " level=" + event.getLevel() + " message=" + event.getMessage() + "\n";
	}

}
import ch.qos.logback.classic.spi.ILoggingEvent
import org.springframework.boot.logging.structured.StructuredLogFormatter

class MyCustomFormat : StructuredLogFormatter<ILoggingEvent> {

	override fun format(event: ILoggingEvent): String {
		return "time=${event.instant} level=${event.level} message=${event.message}\n"
	}

}

如示例所示,您可以返回任意格式,不一定是 JSON。spring-doc.cadn.net.cn

要启用自定义格式,请将属性 logging.structured.format.consolelogging.structured.format.file 设置为您的实现类的完全限定类名。spring-doc.cadn.net.cn

您的实现可以使用一些构造函数参数,这些参数将被自动注入。 有关更多详细信息,请参阅 StructuredLogFormatter 的 JavaDoc。spring-doc.cadn.net.cn

Logback 扩展

Spring Boot 包含许多对 Logback 的扩展,可帮助实现高级配置。 您可以在 logback-spring.xml 配置文件中使用这些扩展。spring-doc.cadn.net.cn

由于标准的 logback.xml 配置文件加载过早,您无法在其中使用扩展功能。 您需要改用 logback-spring.xml,或定义一个 logging.config 属性。
这些扩展无法与 Logback 的 配置扫描 功能一起使用。 如果尝试这样做,对配置文件所做的任何更改都会导致记录类似于以下之一的错误:
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]

特定于配置文件的配置

<springProfile> 标签允许您根据当前激活的 Spring 配置文件(profile)选择性地包含或排除配置的某些部分。 配置文件(profile)段可在 <configuration> 元素内的任意位置使用。 使用 name 属性来指定接受该配置的配置文件。 <springProfile> 标签可包含一个配置文件名称(例如 staging)或一个配置文件表达式。 配置文件表达式支持更复杂的配置文件逻辑,例如 production & (eu-central | eu-west)。 有关更多详细信息,请参阅 Spring Framework 参考指南。 以下示例列出了三个配置文件:spring-doc.cadn.net.cn

<springProfile name="staging">
	<!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>

<springProfile name="dev | staging">
	<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>

<springProfile name="!production">
	<!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>

环境属性

<springProperty> 标签允许您将 Spring Environment 中的属性暴露出来,以便在 Logback 中使用。 如果希望在 Logback 配置中访问 application.properties 文件中的值,此功能将非常有用。 该标签的工作方式与 Logback 的标准 <property> 标签类似。 但不同之处在于:您无需指定直接的 value,而是指定属性的 source(来自 Environment)。 如果您需要将属性存储在非 local 作用域的其他位置,可使用 scope 属性。 如果需要为属性指定备用值(即当该属性未在 Environment 中设置时),可使用 defaultValue 属性。 以下示例展示了如何将属性暴露供 Logback 使用:spring-doc.cadn.net.cn

<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"
		defaultValue="localhost"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
	<remoteHost>${fluentHost}</remoteHost>
	...
</appender>
source 必须采用短横线命名法(例如 my.property-name)进行指定。 不过,可以使用宽松的命名规则向 Environment 添加属性。

Log4j2 扩展

Spring Boot 包含许多对 Log4j2 的扩展,可帮助实现高级配置。 您可以在任意 log4j2-spring.xml 配置文件中使用这些扩展。spring-doc.cadn.net.cn

由于标准的 log4j2.xml 配置文件加载过早,您无法在其中使用扩展功能。 您需要改用 log4j2-spring.xml,或定义一个 logging.config 属性。
这些扩展取代了 Log4J 提供的 Spring Boot 支持。 您应确保不在构建中包含 org.apache.logging.log4j:log4j-spring-boot 模块。

特定于配置文件的配置

<SpringProfile> 标签允许您根据当前激活的 Spring 配置文件(profile)选择性地包含或排除配置的某些部分。 配置文件(profile)段可在 <Configuration> 元素内的任意位置使用。 使用 name 属性来指定接受该配置的配置文件。 <SpringProfile> 标签可包含一个配置文件名称(例如 staging)或一个配置文件表达式。 配置文件表达式支持更复杂的配置文件逻辑,例如 production & (eu-central | eu-west)。 有关更多详细信息,请参阅 Spring Framework 参考指南。 以下示例列出了三个配置文件:spring-doc.cadn.net.cn

<SpringProfile name="staging">
	<!-- configuration to be enabled when the "staging" profile is active -->
</SpringProfile>

<SpringProfile name="dev | staging">
	<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</SpringProfile>

<SpringProfile name="!production">
	<!-- configuration to be enabled when the "production" profile is not active -->
</SpringProfile>

环境属性查找

如果希望在 Log4j2 配置中引用 Spring Environment 中的属性,可以使用以 spring: 为前缀的 查找机制(lookups)。 这样做有助于在 Log4j2 配置中访问 application.properties 文件中的值。spring-doc.cadn.net.cn

以下示例展示了如何设置名为 applicationNameapplicationGroup 的 Log4j2 属性,使其从 Spring Environment 中读取 spring.application.namespring.application.groupspring-doc.cadn.net.cn

<Properties>
	<Property name="applicationName">${spring:spring.application.name}</Property>
	<Property name="applicationGroup">${spring:spring.application.group}</Property>
</Properties>
查找键应使用短横线命名法(例如 my.property-name)指定。

Log4j2 系统属性

Log4j2 支持多个系统属性,可用于配置各项功能。 例如,log4j2.skipJansi 系统属性可用于配置 ConsoleAppender 是否在 Windows 上尝试使用 Jansi 输出流。spring-doc.cadn.net.cn

Log4j2 初始化后加载的所有系统属性均可从 Spring 的 Environment 中获取。 例如,您可以在 application.properties 文件中添加 log4j2.skipJansi=false,以使 ConsoleAppender 在 Windows 上使用 Jansi。spring-doc.cadn.net.cn

Spring Environment 仅在系统属性和操作系统环境变量均未包含待加载的值时才被考虑。
在 Log4j2 早期初始化期间加载的系统属性无法引用 Spring Environment。 例如,Log4j2 用于选择默认 Log4j2 实现的属性,是在 Spring Environment 可用之前使用的。