On this page
26. Logging
Spring Boot 使用Commons Logging进行所有内部日志记录,但是使底层日志实现保持打开状态。为Java Util 记录,Log4J2和Logback提供了默认配置。在每种情况下,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: [/*]
输出以下项目:
日期和时间-毫秒级精度,易于排序。
日志级别—
ERROR
,WARN
,INFO
,DEBUG
或TRACE
。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 如下:
Level | Color |
---|---|
FATAL |
Red |
ERROR |
Red |
WARN |
Yellow |
INFO |
Green |
DEBUG |
Green |
TRACE |
Green |
另外,您可以通过将其提供为转换的选项来指定应使用的颜色或样式。例如,将文本设为黄色:
%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}
支持以下颜色和样式:
blue
cyan
faint
green
magenta
red
yellow
26.3 文件输出
默认情况下,Spring Boot 将仅登录到控制台,并且不会写入日志文件。如果除了控制台输出外还想写日志文件,则需要设置logging.file
或logging.path
属性(例如,在application.properties
中)。
下表显示了如何一起使用logging.*
属性:
表 26.1 记录属性
logging.file |
logging.path |
Example | Description |
---|---|---|---|
(none) | (none) | 仅控制台记录。 | |
Specific file | (none) | my.log |
写入指定的日志文件。名称可以是确切的位置,也可以相对于当前目录。 |
(none) | Specific directory | /var/log |
将spring.log 写入指定的目录。名称可以是确切的位置,也可以相对于当前目录。 |
日志文件达到 10 MB 时将旋转,并且与控制台输出一样,默认记录ERROR
,WARN
和INFO
级别的消息。
Note
日志记录系统在应用程序生命周期的早期进行了初始化,因此在通过@PropertySource
Comments 加载的属性文件中将找不到此类日志记录属性。
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
配置root
Logger。范例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 System | Customization |
---|---|
Logback | logback-spring.xml ,logback-spring.groovy ,logback.xml 或logback.groovy |
Log4j2 | log4j2-spring.xml 或log4j2.xml |
JDK(Java Util 日志记录) | logging.properties |
Note
如果可能,我们建议您将-spring
变体用于日志记录配置(例如logback-spring.xml
而不是logback.xml
)。如果使用标准配置位置,Spring 将无法完全控制日志初始化。
Warning
从“可执行 jar”运行时,Java Util Logging 存在一些已知的类加载问题,这些问题会引起问题。我们建议您尽可能避免使用它。
为了帮助进行自定义,其他一些属性从 Spring Environment
转移到 System 属性:
Spring Environment | System Property | Comments |
---|---|---|
logging.exception-conversion-word |
LOG_EXCEPTION_CONVERSION_WORD |
记录异常时使用的转换词。 |
logging.file |
LOG_FILE |
如果定义,则在默认日志配置中使用。 |
logging.path |
LOG_PATH |
如果定义,则在默认日志配置中使用。 |
logging.pattern.console |
CONSOLE_LOG_PATTERN |
在控制台上使用的日志模式(stdout)。 (仅默认登录设置支持.) |
logging.pattern.file |
FILE_LOG_PATTERN |
文件中使用的日志模式(如果启用了 LOG_FILE)。 (仅默认登录设置支持.) |
logging.pattern.level |
LOG_LEVEL_PATTERN |
用于渲染日志级别的格式(默认为%5p )。 (仅默认登录设置支持.) |
PID |
PID |
当前进程 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
,将尝试所有宽松的变体(myPropertyName
,MY_PROPERTY_NAME
等)。