4.4 日志

优质
小牛编辑
117浏览
2023-12-01

Spring Boot使用Commons Logging进行所有内部日志记录,但保留底层日志实现。 为Java Util Logging,Log4J2和Logback提供了默认配置。 在每种情况下,记录器都预先配置为使用控制台输出,并且还提供可选的文件输出。

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

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

4.4.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: [/*]

输出以下项目:

  • 日期和时间:毫秒精度,易于排序。
  • 日志级别:ERROR,WARN,INFO,DEBUG或TRACE。
  • 进程ID。
  • ---分隔符,用于区分实际日志消息的开始。
  • 线程名称:用方括号括起来(可能会截断控制台输出)。
  • 记录器名称:这通常是源类名称(通常缩写)。
  • 日志消息。

Logback没有FATAL级别。 它映射到ERROR。

4.4.2 控制台输出

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

$ java -jar myapp.jar --debug

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

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

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

4.4.2.1 彩色编码输出

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

使用%clr转换字配置颜色编码。 在最简单的形式中,转换器根据日志级别为输出着色,如以下示例所示:

%clr(%5p)

下表描述了日志级别到颜色的映射:

LevelColor
FATALRed
ERRORRed
WARNYellow
INFOGreen
DEBUGGreen
TRACEGreen

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

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

支持以下颜色和样式:

  • blue
  • cyan
  • faint
  • green
  • magenta
  • red
  • yellow

4.4.3 文件输出

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

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

表26.1 logging属性

logging.filelogging.pathExampleDescription
(none)(none)仅在控制台显示日志
特定文件(none)my.log写入指定的日志文件。 名称可以是精确位置或相对于当前目录。
(none)特定目录/var/log将spring.log写入指定的目录。 名称可以是精确位置或相对于当前目录。

日志文件在达到10 MB时会轮换,并且与控制台输出一样,默认情况下会记录ERROR级别,WARN级别和INFO级别的消息。 可以使用logging.file.max-size属性更改大小限制。 除非已设置logging.file.max-history属性,否则以前轮换的文件将无限期归档。

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

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

4.4.4 日志级别

所有受支持的日志记录系统都可以使用logging.level设置Spring环境中的记录器级别(例如,在application.properties中)。 = 其中level是TRACE,DEBUG,INFO, WARN,ERROR,FATAL或OFF之一。 可以使用logging.level.root配置根记录器。

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

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

4.4.5 日志组

能够将相关记录器组合在一起以便可以同时配置它们通常很有用。 例如,您通常可以更改所有Tomcat相关记录器的日志记录级别,但您无法轻松记住顶级软件包。

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

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

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

logging.level.tomcat=TRACE

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

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

4.4.6 自定义日志配置

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

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

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

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

Logging SystemCustomization
Logbacklogback-spring.xml, logback-spring.groovy, logback.xml, 或 logback.groovy
Log4j2log4j2-spring.xml 或 log4j2.xml
JDK (Java Util Logging)logging.properties

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

Java Util Logging存在已知的类加载问题,从“可执行jar”运行时会导致问题。 如果可能的话,我们建议您在从“可执行jar”运行时避免使用它。

为了帮助进行自定义,一些其他属性从Spring环境传输到System属性,如下表所述:

Spring EnvironmentSystem PropertyComments
logging.exception-conversion-wordLOG_EXCEPTION_CONVERSION_WORD记录异常时使用的转换字。
logging.fileLOG_FILE如果已定义,则在默认日志配置中使用它。
logging.file.max-sizeLOG_FILE_MAX_SIZE最大日志文件大小(如果启用了LOG_FILE)。 (仅支持默认的Logback设置。)
logging.file.max-historyLOG_FILE_MAX_HISTORY要保留的最大归档日志文件数(如果启用了LOG_FILE)。 (仅支持默认的Logback设置。)
logging.pathLOG_PATH如果已定义,则在默认日志配置中使用它。
logging.pattern.consoleCONSOLE_LOG_PATTERN要在控制台上使用的日志模式(stdout)。 (仅支持默认的Logback设置。)
logging.pattern.dateformatLOG_DATEFORMAT_PATTERN日志日期格式的Appender模式。 (仅支持默认的Logback设置。)
logging.pattern.fileFILE_LOG_PATTERN要在文件中使用的日志模式(如果启用了LOG_FILE)。 (仅支持默认的Logback设置。)
logging.pattern.levelLOG_LEVEL_PATTERNThe format to use when rendering the log level (default %5p). (Only supported with the default Logback setup.)
PIDPID当前进程ID(如果可能,则在未定义为OS环境变量时发现)。

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

  • Logback
  • Log4j 2
  • Java Util logging

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

您可以通过仅覆盖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

4.4.7 Logback扩充

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

由于标准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]]

4.4.7.1 特定于配置文件的配置

标记允许您根据活动的Spring配置文件选择性地包含或排除配置部分。配置文件部分支持在元素中的任何位置。使用name属性指定哪个配置文件接受配置。标记可以包含一个简单的概要文件名称(例如,staging)或配置文件表达式。配置文件表达式允许表达更复杂的配置文件逻辑,例如,production & (eu-central | eu-west)。有关详细信息,请参阅参考指南。下面的清单显示了三个示例配置文件:

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

4.4.7.2 环境属性

标记允许您公开Spring环境中的属性,以便在Logback中使用。如果您想要访问您的Logback配置中的application.properties文件中的值,那么这样做可能很有用。标记的工作方式与Logback的标准标记类似。但是,不是指定直接值,而是指定属性的来源(来自环境)。如果需要将属性存储在本地范围以外的其他地方,则可以使用范围属性。如果需要回退值(如果在环境中未设置属性),则可以使用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>

必须短横线命名指定source(例如my.property-name)。 但是,可以使用宽松规则将属性添加到环境中。