26. Logging

Spring Boot 使用Commons Logging进行所有内部日志记录,但是使底层日志实现保持打开状态。为Java Util 记录Log4J2Logback提供了默认配置。在每种情况下,Logger 都已预先配置为使用控制台输出,同时还提供可选文件输出。

默认情况下,如果使用“启动器”,则将使用 Logback 进行日志记录。还包括适当的 Logback 路由,以确保使用 Java Util Logging,Commons Logging,Log4J 或 SLF4J 的从属库都将正常运行。

Tip

有许多可用于 Java 的日志记录框架。如果上面的列表看起来令人困惑,请不要担心。通常,您不需要更改日志记录依赖项,并且 Spring Boot 的默认设置也可以正常工作。

26.1 日志格式

Spring Boot 的默认日志输出如下所示:

2014-03-05 10:57:51.112  INFO 45469 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.52
2014-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2014-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1358 ms
2014-03-05 10:57:51.698  INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2014-03-05 10:57:51.702  INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]

输出以下项目:

  • 日期和时间-毫秒级精度,易于排序。

  • 日志级别— ERRORWARNINFODEBUGTRACE

  • Process ID.

  • ---分隔符用于区分实际日志消息的开始。

  • 线程名称—括在方括号中(对于控制台输出,可能会被截断)。

  • Logger 名称-通常是源类名称(通常是缩写)。

  • 日志消息。

Note

Logback 没有FATAL级别(已 Map 到ERROR)

26.2 控制台输出

默认日志配置将在编写消息时将消息回显到控制台。默认情况下,将记录ERRORWARNINFO级消息。您还可以通过使用--debug标志启动应用程序来启用“调试”模式。

$ java -jar myapp.jar --debug

Note

您还可以在application.properties中指定debug=true

启用调试模式后,将配置一些核心 Logger(嵌入式容器,Hibernate 和 Spring Boot)以输出更多信息。启用调试模式不会将您的应用程序配置为记录所有具有DEBUG级的消息。

另外,您可以通过使用--trace标志(或application.properties中的trace=true)启动应用程序来启用“跟踪”模式。这将启用跟踪日志记录,以供选择一些核心 Logger(嵌入式容器,Hibernate 模式生成和整个 Spring 产品组合)。

26.2.1 颜色编码的输出

如果您的终端支持 ANSI,则将使用彩色输出来提高可读性。您可以将spring.output.ansi.enabled设置为supported value以覆盖自动检测。

使用%clr转换字配置颜色编码。转换器将以最简单的形式根据对数级别为输出着色,例如:

%clr(%5p)

日志级别到颜色的 Map 如下:

LevelColor
FATALRed
ERRORRed
WARNYellow
INFOGreen
DEBUGGreen
TRACEGreen

另外,您可以通过将其提供为转换的选项来指定应使用的颜色或样式。例如,将文本设为黄色:

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

支持以下颜色和样式:

  • blue

  • cyan

  • faint

  • green

  • magenta

  • red

  • yellow

26.3 文件输出

默认情况下,Spring Boot 将仅登录到控制台,并且不会写入日志文件。如果除了控制台输出外还想写日志文件,则需要设置logging.filelogging.path属性(例如,在application.properties中)。

下表显示了如何一起使用logging.*属性:

表 26.1 记录属性

logging.filelogging.pathExampleDescription
(none)(none) 仅控制台记录。
Specific file(none)my.log写入指定的日志文件。名称可以是确切的位置,也可以相对于当前目录。
(none)Specific directory/var/logspring.log写入指定的目录。名称可以是确切的位置,也可以相对于当前目录。

日志文件达到 10 MB 时将旋转,并且与控制台输出一样,默认记录ERRORWARNINFO级别的消息。

Note

日志记录系统在应用程序生命周期的早期进行了初始化,因此在通过@PropertySourceComments 加载的属性文件中将找不到此类日志记录属性。

Tip

日志记录属性与实际的日志记录基础结构无关。结果,Spring Boot 不会 Management 特定的配置密钥(例如 Log 的logback.configurationFile)。

26.4 日志级别

所有受支持的日志记录系统都可以使用'logging.level.* = LEVEL'在 Spring Environment(例如,在application.properties)中设置 Logger 级别,其中'LEVEL'是 TRACE,DEBUG,INFO,WARN,ERROR,FATAL 之一,关闭。可以使用logging.level.root配置rootLogger。范例application.properties

logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR

Note

默认情况下,Spring Boot 重 MapThymeleaf INFO消息,以便它们以DEBUG级别记录。这有助于减少标准日志输出中的噪声。有关如何在自己的配置中应用重新 Map 的详细信息,请参见LevelRemappingAppender

26.5 自定义日志配置

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

您可以通过org.springframework.boot.logging.LoggingSystem system 属性强制 Spring Boot 使用特定的日志系统。该值应为LoggingSystem实现的标准类名。您还可以使用none值完全禁用 Spring Boot 的日志记录配置。

Note

由于日志记录是在创建ApplicationContext之前**初始化的,因此无法从 Spring @Configuration文件中的@PropertySources控制日志记录。系统属性和常规的 Spring Boot 外部配置文件都可以正常工作。)

根据您的日志系统,将加载以下文件:

Logging SystemCustomization
Logbacklogback-spring.xmllogback-spring.groovylogback.xmllogback.groovy
Log4j2log4j2-spring.xmllog4j2.xml
JDK(Java Util 日志记录)logging.properties

Note

如果可能,我们建议您将-spring变体用于日志记录配置(例如logback-spring.xml而不是logback.xml)。如果使用标准配置位置,Spring 将无法完全控制日志初始化。

Warning

从“可执行 jar”运行时,Java Util Logging 存在一些已知的类加载问题,这些问题会引起问题。我们建议您尽可能避免使用它。

为了帮助进行自定义,其他一些属性从 Spring Environment转移到 System 属性:

Spring EnvironmentSystem PropertyComments
logging.exception-conversion-wordLOG_EXCEPTION_CONVERSION_WORD记录异常时使用的转换词。
logging.fileLOG_FILE如果定义,则在默认日志配置中使用。
logging.pathLOG_PATH如果定义,则在默认日志配置中使用。
logging.pattern.consoleCONSOLE_LOG_PATTERN在控制台上使用的日志模式(stdout)。 (仅默认登录设置支持.)
logging.pattern.fileFILE_LOG_PATTERN文件中使用的日志模式(如果启用了 LOG_FILE)。 (仅默认登录设置支持.)
logging.pattern.levelLOG_LEVEL_PATTERN用于渲染日志级别的格式(默认为%5p)。 (仅默认登录设置支持.)
PIDPID当前进程 ID(如果可能,并且尚未将其定义为 OS 环境变量时发现)。

所支持的所有日志记录系统在解析其配置文件时都可以查阅系统属性。有关示例,请参见spring-boot.jar中的默认配置。

Tip

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

Tip

您可以通过仅覆盖LOG_LEVEL_PATTERN(或使用 Logback 覆盖logging.pattern.level)将 MDC 和其他临时内容添加到日志行。例如,如果您使用logging.pattern.level=user:%X{user} %5p,则默认日志格式将包含“用户”的 MDC 条目(如果存在),例如

2015-09-30 12:30:04.031 user:juergen INFO 22174 --- [  nio-8080-exec-0] demo.Controller
Handling authenticated request

26.6 Logback 扩展

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

Note

您无法在标准logback.xml配置文件中使用 extensions,因为 extensions 加载时间过早。您需要使用logback-spring.xml或定义logging.config属性。

Warning

这些扩展不能与 Logback 的configuration scanning一起使用。如果尝试这样做,则对配置文件进行更改将导致类似于以下记录之一的错误:

ERROR in [emailprotected]:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]]
ERROR in [emailprotected]:71 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]

26.6.1 特定于配置文件的配置

<springProfile>标签允许您根据 ActiveSpring 配置文件有选择地包括或排除配置部分。在<configuration>元素内的任何位置都支持 Profile 部分。使用name属性可以指定哪个配置文件接受配置。可以使用逗号分隔的列表指定多个配置文件。

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

26.6.2 环境属性

<springProperty>标签允许您显示 Spring Environment中的属性,以在 Logback 中使用。如果要在登录配置中访问application.properties文件中的值,这将很有用。该标记的工作方式类似于 Logback 的标准<property>标记,但是您无需指定直接的value而是指定属性的source(来自Environment)。如果需要将属性存储在local范围以外的其他位置,则可以使用scope属性。如果在Environment中未设置该属性时需要回退值,则可以使用defaultValue属性。

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

Tip

RelaxedPropertyResolver用于访问Environment属性。如果以虚线符号(my-property-name)指定source,将尝试所有宽松的变体(myPropertyNameMY_PROPERTY_NAME等)。