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 控制台输出

缺省日志配置在写入消息时将消息回显到控制台。默认情况下,将记录ERROR级,WARN级和INFO级消息。您还可以通过使用--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 时会旋转,并且与控制台输出一样,默认记录ERROR -level,WARN -level 和INFO -level 消息。大小限制可以使用logging.file.max-size属性更改。除非已设置logging.file.max-history属性,否则以前旋转的文件将无限期存档。

Note

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

Tip

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

26.4 日志级别

所有支持的日志记录系统都可以使用logging.level.<logger-name>=<level>在 Spring Environment(例如,在application.properties)中设置 Logger 级别,其中level是 TRACE,DEBUG,INFO,WARN,ERROR,FATAL 或 OFF 之一。可以使用logging.level.root来配置rootLogger。

以下示例显示了application.properties中的潜在日志记录设置:

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

26.5 日志组

能够将相关 Logger 组合在一起通常很有用,以便可以同时配置它们。例如,您可能通常会更改与 Tomcat 相关的所有 Logger 的日志记录级别,但是您不容易记住顶级软件包。

为了解决这个问题,Spring Boot 允许您在 Spring Environment中定义日志记录组。例如,这是通过将“ tomcat”组添加到application.properties来定义它的方法:

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

定义后,您可以使用一行更改该组中所有 Logger 的级别:

logging.level.tomcat=TRACE

Spring Boot 包含以下 sched 义的日志记录组,它们可以直接使用:

NameLoggers
weborg.springframework.core.codec , org.springframework.http , org.springframework.web
sqlorg.springframework.jdbc.core , org.hibernate.SQL

26.6 自定义日志配置

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

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

Note

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

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

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 存在一些已知的类加载问题,这些问题会引起问题。我们建议您尽可能从“可执行 jar”运行时避免使用它。

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

Spring EnvironmentSystem PropertyComments
logging.exception-conversion-wordLOG_EXCEPTION_CONVERSION_WORD记录异常时使用的转换字。
logging.fileLOG_FILE如果定义,它将在默认日志配置中使用。
logging.file.max-sizeLOG_FILE_MAX_SIZE最大日志文件大小(如果启用了 LOG_FILE)。 (仅默认登录设置支持.)
logging.file.max-historyLOG_FILE_MAX_HISTORY要保留的最大归档日志文件数(如果启用了 LOG_FILE)。 (仅默认登录设置支持.)
logging.pathLOG_PATH如果定义,它将在默认日志配置中使用。
logging.pattern.consoleCONSOLE_LOG_PATTERN在控制台上使用的日志模式(stdout)。 (仅默认登录设置支持.)
logging.pattern.dateformatLOG_DATEFORMAT_PATTERN记录日期格式的附加模式。 (仅默认登录设置支持.)
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,则默认日志格式包含“ user”的 MDC 条目(如果存在),如以下示例所示。

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

26.7 Logback 扩展

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

Note

由于标准logback.xml配置文件加载时间过早,因此无法在其中使用 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.7.1 特定于配置文件的配置

<springProfile>标签可让您根据有效的 Spring 配置文件有选择地包括或排除配置部分。 <configuration>元素中任何位置都支持概要文件部分。使用name属性指定哪个配置文件接受配置。 <springProfile>标记可以包含一个简单的配置文件名称(例如staging)或一个配置文件表达式。配置文件表达式允许表达更复杂的配置文件逻辑,例如production & (eu-central | eu-west)。查看reference guide以获取更多详细信息。以下 Lists 显示了三个 samples 概要文件:

<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.7.2 环境属性

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

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

Note

source必须在烤肉串情况下指定(例如my.property-name)。但是,可以使用宽松规则将属性添加到Environment