对于最新稳定版本,请使用 Spring Boot 4.0.4spring-doc.cadn.net.cn

日志记录

Spring Boot 使用 Apache Commons Logging 进行所有内部日志记录,但底层日志实现保持开放。 默认配置提供了对 Java Util 日志记录Log4j2Logback 的支持。 在每种情况下,日志记录器均预配置为使用控制台输出,同时也可以选择将日志写入文件。spring-doc.cadn.net.cn

默认情况下,如果你使用了Starters,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-19T11:41:34.298Z  INFO 133764 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : Starting MyApplication using Java 17.0.18 with PID 133764 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2026-03-19T11:41:34.305Z  INFO 133764 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : No active profile set, falling back to 1 default profile: "default"
2026-03-19T11:41:36.256Z  INFO 133764 --- [myapp] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2026-03-19T11:41:36.287Z  INFO 133764 --- [myapp] [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2026-03-19T11:41:36.287Z  INFO 133764 --- [myapp] [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.52]
2026-03-19T11:41:36.401Z  INFO 133764 --- [myapp] [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2026-03-19T11:41:36.410Z  INFO 133764 --- [myapp] [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1869 ms
2026-03-19T11:41:37.187Z  INFO 133764 --- [myapp] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
2026-03-19T11:41:37.225Z  INFO 133764 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : Started MyApplication in 3.661 seconds (process running for 4.255)
2026-03-19T11:41:37.249Z  INFO 133764 --- [myapp] [ionShutdownHook] o.s.b.w.e.tomcat.GracefulShutdown        : Commencing graceful shutdown. Waiting for active requests to complete
2026-03-19T11:41:37.266Z  INFO 133764 --- [myapp] [tomcat-shutdown] o.s.b.w.e.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
您也可以在debug=true中指定application.properties

当调试模式启用时,会选择一些核心日志记录器(嵌入式容器、Hibernate 和 Spring Boot)来输出更多详细信息。 开启调试模式并不会将您的应用程序配置为记录所有带有 DEBUG 级别的消息。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

alternatively, 您可以通过在启动应用程序时添加 --trace 标志(或在 application.properties 中设置 trace=true)来启用“跟踪”模式。spring-doc.cadn.net.cn

这样做可以为一些核心日志记录器(嵌入式容器、Hibernate schema 生成以及整个 Spring 框架)启用跟踪日志记录。spring-doc.cadn.net.cn

spring-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}

以下颜色和样式是支持的: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 <description> </description>

(none)spring-doc.cadn.net.cn

(none)spring-doc.cadn.net.cn

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

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

(none)spring-doc.cadn.net.cn

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

(none)spring-doc.cadn.net.cn

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

将日志写入由spring.log指定的目录中,该目录可以是绝对路径也可以是相对于当前目录的相对路径。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.path才能进行此类配置。spring-doc.cadn.net.cn

Logging properties are independent of the actual logging infrastructure. As a result, specific configuration keys (such as logback.configurationFile for Logback) are not managed by Spring Boot.

文件轮转

如果您使用的是Logback,可以通过您的application.propertiesapplication.yaml文件来精细调整日志滚动设置。 对于所有其他日志记录系统,则需要您自行配置滚动设置(例如,如果您使用的是Log4j2,则可以添加一个log4j2.xmllog4j2-spring.xml文件)。spring-doc.cadn.net.cn

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

姓名 <description> </description>

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

日志级别

所有支持的日志系统都可以在 Spring Environment(例如,在 application.properties 中)通过设置 logging.level.<logger-name>=<level> 来配置记录器级别,其中 level 的取值可以是 TRACE、DEBUG、INFO、WARN、ERROR、FATAL 或 OFF。 root 记录器可以通过使用 logging.level.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 变量

日志组

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

为了帮助实现这一点,Spring Boot 允许您在 Spring Environment 中定义日志组。 例如,以下是通过将其添加到您的 application.properties 来定义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 包含以下预定义的日志组,可以开箱即用:<br/>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

使用日志关闭钩子

为了在应用程序终止时释放日志资源,系统提供了一个关闭钩子(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 的 @Configuration 文件中通过 @PropertySources 来控制日志。 更改日志系统或完全禁用它的唯一方法是通过系统属性。

根据您的日志系统,以下文件会被加载: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

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.properties 中设置 logging.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

日志日期格式的 Appender 模式。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 通用架构

Elastic Common Schema 是一个基于 JSON 的日志格式。spring-doc.cadn.net.cn

要启用 Elastic Common Schema 日志格式,请将适当的 format 属性设置为 ecs:spring-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

The service 值可以使用 logging.structured.ecs.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 Extended Log Format 是基于 JSON 的日志格式,用于 Graylog 日志分析平台。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

如果你添加了标记(markers),这些标记将会以字符串数组的形式出现在 JSON 的 tags 字段中。spring-doc.cadn.net.cn

自定义结构化日志 JSON

Spring Boot 尝试为结构化日志的 JSON 名称和值选择合理的默认设置。 有时,您可能需要对 JSON 做一些小调整以满足自己的需求。 例如,您可能希望更改某些名称以符合您的日志摄取系统的期望。 您还可能想过滤掉某些成员,因为它们对您没有用处。spring-doc.cadn.net.cn

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

<property> </property> <description> </description>

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.idprocid并添加一个固定的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

要实现这一点,您可以使用一个或多个以下属性:<br />spring-doc.cadn.net.cn

<property> </property> <description> </description>

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 配置文件(profiles)来选择性地包含或排除配置中的某些部分。 配置文件片段可以在 <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 配置文件(profiles)来选择性地包含或排除配置中的某些部分。 配置文件片段可以在 <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: 前缀的 查找。 如果您希望在 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>
lookup key 应该使用短横线分隔符(kebab case,例如 my.property-name)指定。

Log4j2 系统属性

Log4j2 支持许多可用于配置各项功能的 系统属性。 例如,log4j2.skipJansi 系统属性可用于配置在 Windows 上 ConsoleAppender 是否尝试使用 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 可用之前使用的。