Logging
Spring Boot使用Commons Logging进行所有内部日志记录,但保留底层日志实现。为Java Util Logging,Log4J2和 Logback提供了默认配置 。在每种情况下,记录器都预先配置为使用控制台输出,并且还提供可选的文件输出。
默认情况下,如果使用“Starters”,则使用Logback进行日志记录。还包括适当的Logback路由,以确保使用Java Util Logging,Commons Logging,Log4J或SLF4J的依赖库都能正常工作。
Java有很多日志框架可供使用。如果以上列表看起来令人困惑,请不要担心。通常,您不需要更改日志记录依赖项,并且Spring Boot默认值可以正常工作。
日志格式
1 | 2014-03-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52 |
输出以下信息:
- 日期和时间:毫秒精度,易于排序。
- 日志级别:
ERROR
,WARN
,INFO
,DEBUG
,或TRACE
。 - 进程ID。
- 一个
---
分离器来区分实际日志消息的开始。 - 线程名称:用方括号括起来(可能会截断控制台输出)。
- 记录器名称:这通常是源类名称(通常缩写)。
- 日志消息。
Logback没有
FATAL
级别。它映射到ERROR
。
控制台输出
默认日志配置会在写入时将消息回显到控制台。默认情况下,会记录ERROR
-level,WARN
-level和INFO
-level消息。您还可以通过使用--debug
标志启动应用程序来启用“调试”模式。
1 | java -jar myapp.jar --debug |
你也可以
debug=true
在你的指定application.properties
。
启用调试模式后,将选择一些核心记录器(嵌入式容器,Hibernate和Spring Boot)以输出更多信息。启用调试模式并没有配置您的应用程序记录所有消息DEBUG
的水平。
或者,您可以通过使用--trace
标志(或trace=true
在您的应用程序中)启动应用程序来启用“跟踪”模式 application.properties
。这样做可以为选择的核心记录器(嵌入式容器,Hibernate模式生成和整个Spring组合)启用跟踪日志记录。
彩色编码输出
如果您的终端支持ANSI,则使用颜色输出来提高可读性。您可以设置 spring.output.ansi.enabled
为 支持的值以覆盖自动检测。
通过使用%clr
转换字配置颜色编码。在最简单的形式中,转换器根据日志级别为输出着色,如以下示例所示:
1 | clr(%5p) |
下表描述了日志级别到颜色的映射:
水平 | 颜色 |
---|---|
FATAL |
红色 |
ERROR |
红色 |
WARN |
黄色 |
INFO |
绿色 |
DEBUG |
绿色 |
TRACE |
绿色 |
或者,您可以通过将其作为转换选项指定应使用的颜色或样式。例如,要使文本变为黄色,请使用以下设置:
1 | clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow} |
支持以下颜色和样式:
blue
cyan
faint
green
magenta
red
yellow
文件输出
默认情况下,Spring Boot仅记录到控制台,不会写入日志文件。如果除了控制台输出之外还要编写日志文件,则需要设置 logging.file
或logging.path
属性(例如,在您的中 application.properties
)。
下表显示了如何logging.*
一起使用这些属性:
记录属性
logging.file |
logging.path |
例子 | 描述 |
---|---|---|---|
(没有) | (没有) | 仅控制台记录。 | |
具体文件 | (没有) | my.log |
写入指定的日志文件。名称可以是精确位置或相对于当前目录。 |
(没有) | 具体目录 | /var/log |
写入spring.log 指定的目录。名称可以是精确位置或相对于当前目录。 |
日志文件在达到10 MB时会轮换,与控制台输出一样,默认情况下会记录ERROR
-level, WARN
-level和INFO
-level消息。可以使用logging.file.max-size
属性更改大小限制。除非logging.file.max-history
已设置属性,否则以前轮换的文件将无限期归档。
日志记录系统在应用程序生命周期的早期初始化。因此,在通过
@PropertySource
注释加载的属性文件中找不到日志记录属性。
日志记录属性独立于实际的日志记录基础结构。因此,
logback.configurationFile
spring Boot不管理特定的配置键(例如Logback)。
日志级别
所有支持的日志系统可以在弹簧设置的记录器级别 Environment
(例如,application.properties
通过使用) logging.level.<logger-name>=<level>
,其中level
为TRACE,DEBUG,INFO,WARN,ERROR,FATAL或OFF之一。该root
记录器可以通过使用被配置logging.level.root
。
以下示例显示了潜在的日志记录设置application.properties
:
1 | logging.level.root=WARN |
日志组
能够将相关记录器组合在一起以便可以同时配置它们通常很有用。例如,您通常可以更改所有 Tomcat相关记录器的日志记录级别 ,但您无法轻松记住顶级软件包。
为了解决这个问题,Spring Boot允许您在Spring中定义日志记录组 Environment
。例如,以下是如何通过将“Tomcat”组添加到您的application.properties
:
1 | logging.group.tomcat = org.apache.catalina,org.apache.coyote,org.apache.tomcat |
定义后,您可以使用一行更改组中所有记录器的级别:
1 | logging.level.tomcat = TRACE |
Spring Boot包含以下预定义的日志记录组,可以直接使用:
名称 | Loggers |
---|---|
WEB | org.springframework.core.codec ,org.springframework.http ,org.springframework.web |
SQL | org.springframework.jdbc.core , org.hibernate.SQL |
自定义日志配置
可以通过在类路径中包含适当的库来激活各种日志记录系统,并且可以通过在类路径的根目录中或在以下Spring Environment
属性指定的位置提供合适的配置文件来进一步自定义:logging.config
。
您可以使用org.springframework.boot.logging.LoggingSystem
系统属性强制Spring Boot使用特定的日志记录系统 。该值应该是实现的完全限定类名LoggingSystem
。您还可以通过使用值来完全禁用Spring Boot的日志记录配置none
。
由于记录被初始化之前的
ApplicationContext
创建,这是不可能控制来自伐木@PropertySources
春季@Configuration
文件。更改日志记录系统或完全禁用它的唯一方法是通过系统属性。
根据您的日志记录系统,将加载以下文件:
日志实现 | 定制 |
---|---|
logback | logback-spring.xml ,logback-spring.groovy ,logback.xml ,或者logback.groovy |
Log4j2 | log4j2-spring.xml 或者 log4j2.xml |
JDK(Java Util Logging) | logging.properties |
如果可能,我们建议您使用
-spring
变量进行日志记录配置(例如,logback-spring.xml
而不是logback.xml
)。如果使用标准配置位置,Spring无法完全控制日志初始化。
Java Util Logging存在已知的类加载问题,从“可执行jar”运行时会导致问题。如果可能的话,我们建议您在从“可执行jar”运行时避免使用它。
为了帮助进行自定义,一些其他属性从Spring转移 Environment
到System属性,如下表所述:
Spring环境 | 系统属性 | 描述 |
---|---|---|
logging.exception-conversion-word |
LOG_EXCEPTION_CONVERSION_WORD |
记录异常时使用的转换字。 |
logging.file |
LOG_FILE |
如果已定义,则在默认日志配置中使用它。 |
logging.file.max-size |
LOG_FILE_MAX_SIZE |
最大日志文件大小(如果启用了LOG_FILE)。(仅支持默认的Logback设置。) |
logging.file.max-history |
LOG_FILE_MAX_HISTORY |
要保留的最大归档日志文件数(如果启用了LOG_FILE)。(仅支持默认的Logback设置。) |
logging.path |
LOG_PATH |
如果已定义,则在默认日志配置中使用它。 |
logging.pattern.console |
CONSOLE_LOG_PATTERN |
要在控制台上使用的日志模式(stdout)。(仅支持默认的Logback设置。) |
logging.pattern.dateformat |
LOG_DATEFORMAT_PATTERN |
日志日期格式的Appender模式。(仅支持默认的Logback设置。) |
logging.pattern.file |
FILE_LOG_PATTERN |
要在文件中使用的日志模式(如果LOG_FILE 已启用)。(仅支持默认的Logback设置。) |
logging.pattern.level |
LOG_LEVEL_PATTERN |
呈现日志级别时使用的格式(默认%5p )。(仅支持默认的Logback设置。) |
PID |
PID |
当前进程ID(如果可能,则在未定义为OS环境变量时发现)。 |
所有受支持的日志记录系统在分析其配置文件时都可以查阅系统属性。有关spring-boot.jar
示例,请参阅默认配置:
如果要在日志记录属性中使用占位符,则应使用 Spring Boot的语法而不是底层框架的语法。值得注意的是,如果使用Logback,则应将其
:
用作属性名称与其默认值之间的分隔符,而不是使用:-
。
您可以通过仅覆盖
LOG_LEVEL_PATTERN
(或logging.pattern.level
使用Logback)将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
Logback扩展
Spring Boot包含许多Logback扩展,可以帮助进行高级配置。您可以在logback-spring.xml
配置文件中使用这些扩展名。
由于标准
logback.xml
配置文件加载过早,因此无法在其中使用扩展。您需要使用logback-spring.xml
或定义logging.config
属性。
扩展不能与Logback的 配置扫描一起使用。如果您尝试这样做,更改配置文件会导致类似于以下记录之一的错误:
1 | ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]] |
特定于配置文件的配置
该<springProfile>
标签可以让你选择性地包括或排除基于主动春型材配置的部分。在<configuration>
元素内的任何位置都支持配置文件节。使用该name
属性指定哪个配置文件接受配置。所述<springProfile>
标记可包含一个简单的配置文件的名称(例如staging
)或轮廓表达。例如,简档表达式允许表达更复杂的简档逻辑 production & (eu-central | eu-west)
。有关详细信息,请查阅 参考指南。以下清单显示了三个示例配置文件:
1 | <springProfile name = “staging” > |
环境属性
该<springProperty>
标记允许您公开Spring中的属性Environment
以便在Logback中使用。如果要application.properties
在Logback配置中访问文件中的值,则此操作非常有用 。标签的工作方式与Logback的标准<property>
标签类似。但是,value
您可以指定source
属性(来自Environment
),而不是指定直接 属性。如果需要将属性存储在local
范围之外的其他位置,则可以使用该scope
属性。如果需要回退值(如果未在中设置属性 Environment
),则可以使用该defaultValue
属性。以下示例显示如何公开在Logback中使用的属性:
1 | <springProperty scope = “context” name = “fluentHost” source = “myapp.fluentd.host” |
在
source
必须在串的情况下(如指定my.property-name
)。但是,可以Environment
使用宽松规则将属性添加到属性中。