4.4。日志
Spring Boot使用Commons Logging
进行所有内部日志记录,但是使底层日志实现打开状态。为Java Util Logging
,Log4J2
和Logback
提供了默认配置。在每种情况下,记录器都已预先配置为使用控制台输出,同时还提供可选文件输出。
默认情况下,如果使用Starters,则使用Logback进行日志记录。还包括适当的Logback路由,以确保使用Java Util Logging,Commons Logging,Log4J或SLF4J的从属库都可以正常工作。
4.4.1。日志格式
Spring Boot的默认日志输出类似于以下示例:
2019-11-11 11:51:57.697 INFO 16640 --- [ main] study.hwj.springboot.MyApplication : The following profiles are active: dev
2019-11-11 11:51:58.910 INFO 16640 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
- 日期和时间:毫秒精度,易于排序。
- 日志级别:ERROR,WARN,INFO,DEBUG,或TRACE。
- 进程ID。
---
分隔符来区分实际日志消息的开始。- 线程名称:用方括号括起来(对于控制台输出可能会被截断)。
- Logger名称:这通常是源类名称(通常缩写)。
- 日志消息。
Logback没有FATAL级别。它被映射到ERROR。
4.4.2。控制台输出
默认日志配置在消息写入时将消息回显到控制台。默认情况下,将记录ERROR,WARN和INFO级别的消息。您还可以通过使用--debug
标志启动应用程序来启用“调试”模式。
颜色编码输出
如果您的终端支持ANSI
,则使用彩色输出来提高可读性。您可以设置spring.output.ansi.enabled
以覆盖自动检测。
通过使用%clr
转换字来配置颜色编码。最简单的转换示例所示:
%clr(%5p)
下表描述了日志级别到颜色的映射:
日志级别 | 颜色 |
---|---|
FATAL | 红色 |
ERROR | 红色 |
WARN | 黄色 |
INFO | 绿色 |
DEBUG | 绿色 |
TRACE | 绿色 |
可以通过将其提供为转换的选项来指定应使用的颜色或样式。例如,要使文本变黄,请使用以下设置:
%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}
支持以下颜色和样式:
- blue
- cyan
- faint
- green
- magenta
- red
- yellow
4.4.3。文件输出
默认情况下,Spring Boot仅记录到控制台,不写日志文件。如果除了控制台输出外还想写日志文件,则需要设置一个logging.file.name
或logging.file.path
属性(例如,在application.properties中)。
日志记录属性:
logging.file.name | logging.file.path | 示例 | 描述 |
---|---|---|---|
(没有) | (没有) | 仅控制台记录。 | |
特定文件 | (没有) | my.log | 写入指定的日志文件。名称可以是确切位置,也可以是相对于当前目录的位置。 |
(没有) | 具体目录 | /var/log | 写入spring.log指定的目录。名称可以是确切位置,也可以是相对于当前目录的位置。 |
日志文件达到10 MB时会旋转,并且与控制台输出一样,默认情况下会记录ERROR,WARN和INFO消息。可以使用logging.file.max-size
属性更改大小限制。除非已设置logging.file.max-history
属性,否则以前旋转的文件将无限期存档。日志档案的总大小可以使用logging.file.total-size-cap
设置上限。当日志归档的总大小超过该阈值时,将删除备份。要在应用程序启动时强制清除日志存档,请使用logging.file.clean-history-on-start
属性。
日志记录属性独立于实际的日志记录基础结构。结果,Spring Boot不会管理特定的配置键(例如Logback的logback.configurationFile
)。
4.4.4。日志级别
所有支持的日志系统可以在Spring Environment设置日志级别(例如,通过使用application.properties),logging.level.<logger-name>=<level>
,其中level为TRACE,DEBUG,INFO,WARN,ERROR,FATAL或OFF之一。root Logger可以通过使用logging.level.root
被配置。
以下示例显示了application.properties中的默认日志记录设置:
logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
也可以使用环境变量设置日志记录级别。例如,LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG
将设置org.springframework.web
为DEBUG。
以上方法仅适用于程序包级别的日志记录。由于宽松的绑定总是将环境变量转换为小写,因此无法以这种方式为单个类配置日志记录。如果需要为类配置日志记录,则可以使用该SPRING_APPLICATION_JSON变量。
4.4.5。日志组
能够将相关记录器分组在一起通常很有用,以便可以同时配置它们。例如,您可能通常会更改所有与Tomcat相关的记录器的记录级别,但是您不容易记住顶层软件包。
为了解决这个问题,Spring Boot允许您在Spring Environment中定义日志记录组。例如,这是通过将“ tomcat”组添加到您的方式来定义它的方法application.properties:
logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat
定义后,您可以使用一行配置更改该组中所有记录器的级别:
logging.level.tomcat=TRACE
Spring Boot包含以下预定义的日志记录组,它们可以直接使用:
名称 | Loggers |
---|---|
web |
org.springframework.core.codec,org.springframework.http,org.springframework.web,org.springframework.boot.actuate.endpoint.web,org.springframework.boot.web.servlet.ServletContextInitializerBeans |
sql |
org.springframework.jdbc.core,org.hibernate.SQL,org.jooq.tools.LoggerListener |
4.4.6。自定义日志配置
可以通过在类路径中包含适当的库来激活各种日志记录系统,并可以通过在类路径的根目录或Spring Environment属性logging.config
指定的位置中提供适当的配置文件来进一步自定义各种日志记录系统。
您可以通过使用org.springframework.boot.logging.LoggingSystem
系统属性来强制Spring Boot使用特定的日志系统。该值应该是实现的完全限定的类名LoggingSystem。您还可以通过使用值none完全禁用Spring Boot的日志记录配置。
-Dorg.springframework.boot.logging.LoggingSystem=none
由于日志记录是在ApplicationContext
创建之前初始化的,因此无法从Spring @Configuration
文件中控制@PropertySources
的日志记录。更改日志记录系统或完全禁用它的唯一方法是通过系统属性。
根据不同的日志系统加载不同的配置文件:
日志系统 | 日志系统配置文件 |
---|---|
Logback | logback-spring.xml, logback-spring.groovy,logback.xml, or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JDK | (Java Util Logging) logging.properties |
建议您将 -spring
变体用于日志记录配置(例如,logback-spring.xml
而不是logback.xml
)。如果使用标准配置位置,Spring将无法完全控制日志初始化。
从“可执行jar”运行时,Java Util Logging存在一些已知的类加载问题,这些问题会引起问题。我们建议您尽可能从“可执行jar”运行时避免使用它。
为了帮助进行自定义,如下表所述,一些在Spring Environment中的属性也可以在System属性中配置:
Spring Environment | System Property | 备注 |
---|---|---|
logging.exception-conversion-word |
LOG_EXCEPTION_CONVERSION_WORD | 记录异常时使用的转换字。 |
logging.file.clean-history-on-start |
LOG_FILE_CLEAN_HISTORY_ON_START | 是否在启动时清除存档日志文件(如果启用了LOG_FILE)。(仅默认的Logback设置受支持。) |
logging.file.name |
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.file.path |
LOG_PATH | 如果定义,它将在默认日志配置中使用。 |
logging.file.total-size-cap |
LOG_FILE_TOTAL_SIZE_CAP | 要保留的日志备份的总大小(如果启用了LOG_FILE)。(仅默认的Logback设置受支持。) |
logging.pattern.console |
CONSOLE_LOG_PATTERN | 控制台上使用的日志模式(stdout)。(仅默认的Logback设置受支持。) |
logging.pattern.dateformat |
LOG_DATEFORMAT_PATTERN | 记录日期格式的附加模式。(仅默认的Logback设置受支持。) |
logging.pattern.file |
FILE_LOG_PATTERN | 文件中使用的日志模式(如果LOG_FILE已启用)。(仅默认的Logback设置受支持。) |
logging.pattern.level |
LOG_LEVEL_PATTERN | 呈现日志级别时使用的格式(默认%5p)。(仅默认的Logback设置受支持。) |
logging.pattern.rolling-file-name |
ROLLING_FILE_NAME_PATTERN | 过渡日志文件名的模式(默认${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz)。(仅默认的Logback设置受支持。) |
PID |
PID | 当前进程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条目(如果存在),如以下示例所示。
2019-11-11 15:38:24.830 requestId:c60b9602-d273-4173-8ca2-2a3f2f2b438d INFO 1980 --- [nio-8080-exec-1] study.hwj.springboot.MyController : MyController...ttttt
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]]
特定于Profile的配置
使用<springProfile>
标签,您可以根据激活的Spring Profiles选择包括或排除配置部分。Profile部分在<configuration>
标签内的任何位置都受支持。使用name
属性指定哪个 Profile 接受配置。<springProfile>
标签可包含一个简单的 Profile 的名称(例如staging)或 Profile 表达式。Profile 表达式允许表达更复杂的 Profile 逻辑,例如production & (eu-central | eu-west
)。有关更多详细信息,请参阅参考指南。以下清单显示了三个样本 Profiles:
<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>
环境特性
<springProperty>
标签可以让你公开Spring Environment属性让Logback使用。如果您想从Logback配置中访问application.properties文件中的值,这样做会很有用。该标签的工作方式类似于Logback的标准<property>
标签。但是,您无需直接指定value
,而是指定source
属性(来自Environment)。如果需要将属性存储在local
范围之外的其他位置,则可以使用scope
属性。如果需要fallback值(以防未在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>
source
属性必须是短横线式语法(例如my.property-name
)。但是,可以使用宽松规则将属性添加到Environment中。
Spring Boot日志原理
参考源码:
使用org.springframework.boot.context.logging.LoggingApplicationListener
监听器监听多个事件:
ApplicationStartingEvent.class,
ApplicationEnvironmentPreparedEvent.class,
ApplicationPreparedEvent.class,
ContextClosedEvent.class,
ApplicationFailedEvent.class
在触发ApplicationStartingEvent
事件时,初始化日志系统,参考org.springframework.boot.logging.LoggingSystem#get(java.lang.ClassLoader)