Logging

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

默认情况下,如果使用Starters,则使用 Logback 进行日志记录。 还包括适当的 Logback 路由,以确保使用 Java Util Logging、Commons Logging、Log4J 或 SLF4J 的依赖库都能正常工作。spring-doc.cn

有很多可用于 Java 的日志记录框架。 如果上面的列表看起来令人困惑,请不要担心。 通常,您不需要更改日志记录依赖项,并且 Spring Boot 默认值可以正常工作。
将应用程序部署到 servlet 容器或应用程序服务器时,使用 Java Util Logging API 执行的日志记录不会路由到应用程序的日志中。 这可以防止容器或已部署到容器的其他应用程序执行的日志记录显示在应用程序的日志中。

日志格式

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

2024-11-21T16:15:09.025Z  INFO 124786 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : Starting MyApplication using Java 17.0.13 with PID 124786 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2024-11-21T16:15:09.028Z  INFO 124786 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : No active profile set, falling back to 1 default profile: "default"
2024-11-21T16:15:13.258Z  INFO 124786 --- [myapp] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2024-11-21T16:15:13.322Z  INFO 124786 --- [myapp] [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-11-21T16:15:13.331Z  INFO 124786 --- [myapp] [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.33]
2024-11-21T16:15:13.604Z  INFO 124786 --- [myapp] [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-11-21T16:15:13.608Z  INFO 124786 --- [myapp] [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 4234 ms
2024-11-21T16:15:15.285Z  INFO 124786 --- [myapp] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
2024-11-21T16:15:15.320Z  INFO 124786 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : Started MyApplication in 7.878 seconds (process running for 9.044)
2024-11-21T16:15:15.368Z  INFO 124786 --- [myapp] [ionShutdownHook] o.s.b.w.e.tomcat.GracefulShutdown        : Commencing graceful shutdown. Waiting for active requests to complete
2024-11-21T16:15:15.386Z  INFO 124786 --- [myapp] [tomcat-shutdown] o.s.b.w.e.tomcat.GracefulShutdown        : Graceful shutdown complete

输出以下项目:spring-doc.cn

  • 日期和时间:毫秒级精度,易于排序。spring-doc.cn

  • 日志级别:、 、 、 或 。ERRORWARNINFODEBUGTRACEspring-doc.cn

  • 进程 ID。spring-doc.cn

  • 用于区分实际日志消息的开头的分隔符。---spring-doc.cn

  • 应用程序名称:括在方括号中(默认情况下,仅在设置时记录)spring.application.namespring-doc.cn

  • 应用程序组:括在方括号中(仅在设置时默认记录)spring.application.groupspring-doc.cn

  • 线程名称:括在方括号中(对于控制台输出,可能会被截断)。spring-doc.cn

  • Correlation ID:如果启用了跟踪(在上面的示例中未显示)spring-doc.cn

  • Logger name:这通常是源类名称(通常缩写)。spring-doc.cn

  • 日志消息。spring-doc.cn

Logback 没有级别。 它映射到 。FATALERROR
如果您有属性但不希望它被记录下来,则可以设置为 .spring.application.namelogging.include-application-namefalse
如果您有属性但不希望它被记录下来,则可以设置为 .spring.application.grouplogging.include-application-groupfalse
有关关联 ID 的更多详细信息,请参阅此文档

控制台输出

默认日志配置在写入消息时将消息回显到控制台。 默认情况下,将记录 -level、-level 和 -level 消息。 您还可以通过使用标志启动应用程序来启用 “debug” 模式。ERRORWARNINFO--debugspring-doc.cn

$ java -jar myapp.jar --debug
您还可以在 .debug=trueapplication.properties

启用调试模式后,将配置一系列核心 Logger(嵌入式容器、Hibernate 和 Spring Boot)以输出更多信息。 启用 debug 模式不会将应用程序配置为记录所有具有 level 的消息。DEBUGspring-doc.cn

或者,您可以通过使用标志启动应用程序(或在您的 . 这样做可以为选定的核心 Logger(嵌入式容器、Hibernate 模式生成和整个 Spring 产品组合)启用跟踪日志记录。--tracetrace=trueapplication.propertiesspring-doc.cn

颜色编码输出

如果您的终端支持 ANSI,则使用颜色输出来提高可读性。 您可以设置为支持的值以覆盖自动检测。spring.output.ansi.enabledspring-doc.cn

颜色编码是使用转换词配置的。 在最简单的形式中,转换器根据对数级别对输出进行着色,如以下示例所示:%clrspring-doc.cn

%clr(%5p)

下表描述了对数级别到颜色的映射:spring-doc.cn

水平 颜色

FATALspring-doc.cn

spring-doc.cn

ERRORspring-doc.cn

spring-doc.cn

WARNspring-doc.cn

黄色spring-doc.cn

INFOspring-doc.cn

绿spring-doc.cn

DEBUGspring-doc.cn

绿spring-doc.cn

TRACEspring-doc.cn

绿spring-doc.cn

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

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

支持以下颜色和样式:spring-doc.cn

文件输出

默认情况下, Spring Boot 仅记录到控制台,不写入日志文件。 如果除了控制台输出之外,还想写入日志文件,则需要设置 or 属性(例如,在您的 中)。 如果两个属性都设置了,则忽略并仅使用。logging.file.namelogging.file.pathapplication.propertieslogging.file.pathlogging.file.namespring-doc.cn

下表显示了如何结合使用这些属性:logging.*spring-doc.cn

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

(无)spring-doc.cn

(无)spring-doc.cn

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

特定文件(例如my.log)spring-doc.cn

(无)spring-doc.cn

写入 指定的位置。 该位置可以是绝对位置,也可以是相对于当前目录的位置。logging.file.namespring-doc.cn

(无)spring-doc.cn

特定目录(例如/var/log)spring-doc.cn

写入 指定的目录。 该目录可以是绝对目录,也可以是相对于当前目录的目录。spring.loglogging.file.pathspring-doc.cn

特定文件spring-doc.cn

特定目录spring-doc.cn

写入 并忽略 指定的位置。 该位置可以是绝对位置,也可以是相对于当前目录的位置。logging.file.namelogging.file.pathspring-doc.cn

日志文件在达到 10 MB 时轮换,与控制台输出一样,默认情况下会记录 -level、-level 和 -level 消息。ERRORWARNINFOspring-doc.cn

日志记录属性独立于实际的日志记录基础结构。 因此,特定的配置键(例如 Logback)不受 Spring Boot 的管理。logback.configurationFile

文件旋转

如果您使用的是 Logback,则可以使用 or 文件微调日志轮换设置。 对于所有其他日志记录系统,您需要直接自己配置轮换设置(例如,如果您使用 Log4j2,则可以添加 or 文件)。application.propertiesapplication.yamllog4j2.xmllog4j2-spring.xmlspring-doc.cn

支持以下轮换策略属性:spring-doc.cn

名字 描述

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

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

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

是否应在应用程序启动时进行日志存档清理。spring-doc.cn

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

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

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

日志存档在被删除之前可以占用的最大大小。spring-doc.cn

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

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

日志级别

所有受支持的日志记录系统都可以在 Spring Environment(例如,in)中使用 where is TRACE、DEBUG、INFO、WARN、ERROR、FATAL 或 OFF 之一来设置 Logger 级别。 可以使用 来配置 Logger。application.propertieslogging.level.<logger-name>=<level>levelrootlogging.level.rootspring-doc.cn

以下示例显示了 中的潜在日志记录设置:application.propertiesspring-doc.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=DEBUGorg.springframework.webDEBUGspring-doc.cn

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

日志组

能够将相关的 logger 分组在一起,以便可以同时配置它们通常很有用。 例如,您可能通常会更改所有与 Tomcat 相关的 Logger 的日志记录级别,但您无法轻松记住顶级包。spring-doc.cn

为了帮助解决这个问题,Spring Boot 允许您在 Spring Environment 中定义日志记录组。 例如,以下是如何通过将 “tomcat” 组添加到您的 :application.propertiesspring-doc.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"

定义后,您可以使用一行更改组中所有 logger 的级别:spring-doc.cn

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

Spring Boot 包括以下预定义的日志记录组,这些组可以开箱即用:spring-doc.cn

名字 Logging

Webspring-doc.cn

org.springframework.core.codec, , , ,org.springframework.httporg.springframework.weborg.springframework.boot.actuate.endpoint.weborg.springframework.boot.web.servlet.ServletContextInitializerBeansspring-doc.cn

SQLspring-doc.cn

org.springframework.jdbc.core、 LoggerListenerorg.hibernate.SQLspring-doc.cn

使用日志关闭钩子

为了在应用程序终止时释放日志记录资源,提供了一个关闭钩子,该钩子将在 JVM 退出时触发日志系统清理。 除非您的应用程序部署为 war 文件,否则会自动注册此关闭钩子。 如果您的应用程序具有复杂的上下文层次结构,则 shutdown 钩子可能无法满足您的需求。 如果没有,请禁用 shutdown 钩子并调查底层日志记录系统直接提供的选项。 例如,Logback 提供了上下文选择器,允许在自己的上下文中创建每个 Logger。 你可以使用该属性来禁用 shutdown 钩子。 将其设置为 将禁用注册。 您可以在 or 文件中设置该属性:logging.register-shutdown-hookfalseapplication.propertiesapplication.yamlspring-doc.cn

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

自定义日志配置

可以通过在 Classpath 中包含适当的库来激活各种日志记录系统,并且可以通过在 Classpath 的根目录或以下 Spring Environment 属性指定的位置提供合适的配置文件来进一步自定义:。logging.configspring-doc.cn

你可以通过使用LoggingSystem系统属性来强制 Spring Boot 使用特定的日志记录系统。 该值应该是 LoggingSystem 实现的完全限定类名。 您还可以使用值 .nonespring-doc.cn

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

根据您的日志记录系统,将加载以下文件:spring-doc.cn

测井系统 定制

Logback (日志返回)spring-doc.cn

logback-spring.xmllogback-spring.groovylogback.xmllogback.groovyspring-doc.cn

日志 4j2spring-doc.cn

log4j2-spring.xmllog4j2.xmlspring-doc.cn

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

logging.propertiesspring-doc.cn

如果可能,我们建议您对日志记录配置使用 variants(例如,而不是 )。 如果使用标准配置位置, Spring 则无法完全控制日志初始化。-springlogback-spring.xmllogback.xml
Java Util Logging 存在已知的类加载问题,这些问题会导致在从“可执行 jar”运行时出现问题。 我们建议您尽可能避免从“可执行 jar”运行时使用它。

为了帮助进行自定义,一些其他属性从 Spring Environment 转移到 System 属性。 这允许记录系统配置来使用属性。例如,在环境变量中设置或设置为环境变量将导致设置 System 属性。 下表描述了传输的属性:logging.file.nameapplication.propertiesLOGGING_FILE_NAMELOG_FILEspring-doc.cn

Spring 环境 系统属性 评论

logging.exception-conversion-wordspring-doc.cn

LOG_EXCEPTION_CONVERSION_WORDspring-doc.cn

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

logging.file.namespring-doc.cn

LOG_FILEspring-doc.cn

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

logging.file.pathspring-doc.cn

LOG_PATHspring-doc.cn

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

logging.pattern.consolespring-doc.cn

CONSOLE_LOG_PATTERNspring-doc.cn

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

logging.pattern.dateformatspring-doc.cn

LOG_DATEFORMAT_PATTERNspring-doc.cn

日志日期格式的 Appender 模式。spring-doc.cn

logging.charset.consolespring-doc.cn

CONSOLE_LOG_CHARSETspring-doc.cn

用于控制台日志记录的字符集。spring-doc.cn

logging.threshold.consolespring-doc.cn

CONSOLE_LOG_THRESHOLDspring-doc.cn

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

logging.pattern.filespring-doc.cn

FILE_LOG_PATTERNspring-doc.cn

要在文件中使用的日志模式(如果已启用)。LOG_FILEspring-doc.cn

logging.charset.filespring-doc.cn

FILE_LOG_CHARSETspring-doc.cn

用于文件日志记录的字符集(如果已启用)。LOG_FILEspring-doc.cn

logging.threshold.filespring-doc.cn

FILE_LOG_THRESHOLDspring-doc.cn

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

logging.pattern.levelspring-doc.cn

LOG_LEVEL_PATTERNspring-doc.cn

渲染日志级别时使用的格式 (default )。%5pspring-doc.cn

logging.structured.format.consolespring-doc.cn

CONSOLE_LOG_STRUCTURED_FORMATspring-doc.cn

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

logging.structured.format.filespring-doc.cn

FILE_LOG_STRUCTURED_FORMATspring-doc.cn

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

PIDspring-doc.cn

PIDspring-doc.cn

当前进程 ID(如果可能且尚未定义为 OS 环境变量,则已发现)。spring-doc.cn

如果使用 Logback,则还会传输以下属性:spring-doc.cn

Spring 环境 系统属性 评论

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

LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERNspring-doc.cn

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

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

LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_STARTspring-doc.cn

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

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

LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZEspring-doc.cn

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

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

LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAPspring-doc.cn

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

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

LOGBACK_ROLLINGPOLICY_MAX_HISTORYspring-doc.cn

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

所有受支持的日志记录系统都可以在解析其配置文件时查阅 System properties。 有关示例,请参阅中的默认配置:spring-boot.jarspring-doc.cn

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

您可以通过仅覆盖(或使用 Logback)将 MDC 和其他临时内容添加到日志行中。 例如,如果使用 ,则默认日志格式包含 “user” 的 MDC 条目(如果存在),如以下示例所示。LOG_LEVEL_PATTERNlogging.pattern.levellogging.pattern.level=user:%X{user} %5pspring-doc.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.cn

要启用结构化日志记录,请将属性 (for console output) 或 (for file output) 设置为要使用的格式的 id。logging.structured.format.consolelogging.structured.format.filespring-doc.cn

Elastic 通用架构

Elastic Common Schema 是一种基于 JSON 的日志记录格式。spring-doc.cn

要启用 Elastic Common Schema 日志格式,请将相应的属性设置为 :formatecsspring-doc.cn

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

日志行如下所示:spring-doc.cn

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

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

可以使用 properties 自定义这些值:servicelogging.structured.ecs.servicespring-doc.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.cn

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

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

日志行如下所示:spring-doc.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 Fluent 日志记录 API 通过 addKeyValue 方法将键值对添加到记录的 JSON 对象中。spring-doc.cn

可以使用属性自定义多个字段:logging.structured.gelfspring-doc.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.cn

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

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

日志行如下所示:spring-doc.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 Fluent 日志记录 API 通过 addKeyValue 方法将键值对添加到记录的 JSON 对象中。spring-doc.cn

如果您添加标记,这些标记将显示在 JSON 的字符串数组中。tagsspring-doc.cn

自定义结构化日志记录 JSON

Spring Boot 尝试为结构化日志记录的 JSON 名称和值输出选择合理的默认值。 但是,有时您可能希望根据自己的需要对 JSON 进行一些小的调整。 例如,您可能希望更改某些名称以匹配日志摄取系统的预期。 您可能还希望筛选掉某些成员,因为您发现它们没有用处。spring-doc.cn

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

财产 描述

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

从 JSON 中筛选特定路径spring-doc.cn

logging.structured.json.renamespring-doc.cn

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

logging.structured.json.addspring-doc.cn

向 JSON 添加其他成员spring-doc.cn

例如,以下内容将排除 、 rename to 并添加固定字段:log.levelprocess.idprocidcorpnamespring-doc.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.customizerMETA-INF/spring.factories

支持其他结构化日志记录格式

Spring Boot 中的结构化日志记录支持是可扩展的,允许您定义自己的自定义格式。 为此,请实现 StructuredLogFormatter 接口。使用 Logback 时泛型类型参数必须是 ILoggingEvent,使用 Log4j2 时必须是 LogEvent(这意味着您的实现与特定的日志记录系统相关联)。 然后,使用 log 事件调用您的实现,并返回要记录的 String,如以下示例所示:spring-doc.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.cn

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

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

Logback 扩展

Spring Boot 包含许多 Logback 扩展,可以帮助进行高级配置。 您可以在配置文件中使用这些扩展。logback-spring.xmlspring-doc.cn

由于标准配置文件加载得太早,因此不能在其中使用扩展。 您需要使用或定义属性。logback.xmllogback-spring.xmllogging.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]]

特定于配置文件的配置

该标记允许您根据活动的 Spring 配置文件选择性地包含或排除配置部分。 元素中的任何位置都支持 Profile 部分。 使用 属性 指定接受配置的配置文件。 标记可以包含配置文件名称(例如 )或配置文件表达式。 配置文件表达式允许表示更复杂的配置文件逻辑,例如 . 有关更多详细信息,请查看 Spring Framework 参考指南。 以下清单显示了三个示例配置文件:<springProfile><configuration>name<springProfile>stagingproduction & (eu-central | eu-west)spring-doc.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>

环境属性

该标签允许您公开 Spring Environment 中的属性,以便在 Logback 中使用。 如果要在 Logback 配置中访问文件中的值,则这样做可能很有用。 该标签的工作方式与 Logback 的标准标签类似。 但是,您不是指定 direct ,而是指定属性的 (从 Environment 中)。 如果需要将属性存储在范围以外的其他位置,则可以使用该属性。 如果需要回退值(如果未在 Environment 中设置该属性),则可以使用该属性。 以下示例显示了如何公开要在 Logback 中使用的属性:<springProperty>application.properties<property>valuesourcelocalscopedefaultValuespring-doc.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>
必须在 kebab 大小写中指定 (例如 )。 但是,可以使用宽松规则将属性添加到 Environment 中。sourcemy.property-name

Log4j2 扩展

Spring Boot 包含许多对 Log4j2 的扩展,这些扩展可以帮助进行高级配置。 您可以在任何配置文件中使用这些扩展。log4j2-spring.xmlspring-doc.cn

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

特定于配置文件的配置

该标记允许您根据活动的 Spring 配置文件选择性地包含或排除配置部分。 元素中的任何位置都支持 Profile 部分。 使用 属性 指定接受配置的配置文件。 标记可以包含配置文件名称(例如 )或配置文件表达式。 配置文件表达式允许表示更复杂的配置文件逻辑,例如 . 有关更多详细信息,请查看 Spring Framework 参考指南。 以下清单显示了三个示例配置文件:<SpringProfile><Configuration>name<SpringProfile>stagingproduction & (eu-central | eu-west)spring-doc.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 中的属性,可以使用带前缀的查找。 如果要在 Log4j2 配置中访问文件中的值,则这样做可能很有用。spring:application.propertiesspring-doc.cn

以下示例显示了如何设置名为 and 的 Log4j2 属性,该属性从 Spring Environment 读取和:applicationNameapplicationGroupspring.application.namespring.application.groupspring-doc.cn

<Properties>
	<Property name="applicationName">${spring:spring.application.name}</Property>
	<Property name="applicationGroup">${spring:spring.application.group}</Property>
</Properties>
查找键应以 kebab 大小写指定(例如 )。my.property-name

Log4j2 系统属性

Log4j2 支持许多可用于配置各种项目的系统属性。 例如,system属性可用于配置ConsoleAppender是否将尝试在 Windows 上使用 Jansi 输出流。log4j2.skipJansispring-doc.cn

Log4j2 初始化后加载的所有系统属性都可以从 Spring Environment 中获取。 例如,你可以添加到文件中,让ConsoleAppender在 Windows 上使用 Jansi。log4j2.skipJansi=falseapplication.propertiesspring-doc.cn

仅当系统属性和 OS 环境变量不包含正在加载的值时,才会考虑 Spring Environment
在早期 Log4j2 初始化期间加载的系统属性无法引用 Spring Environment。 例如,在 Spring Environment 可用之前,使用了 Log4j2 用于允许选择默认 Log4j2 实现的属性。