此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1! |
Spring Boot 使用共享资源日志记录进行所有内部日志记录,但将底层日志实现保持打开状态。 为 Java Util Logging、Log4j2 和 Logback 提供了缺省配置。 在每种情况下,记录器都预先配置为使用控制台输出,并提供可选的文件输出。
默认情况下,如果使用“Starters”,则使用 Logback 进行日志记录。 还包括适当的 Logback 路由,以确保使用 Java Util Logging、Commons Logging、Log4J 或 SLF4J 的依赖库都能正常工作。
有很多可用于 Java 的日志框架。 如果上面的列表看起来令人困惑,请不要担心。 通常,您不需要更改日志记录依赖项,Spring Boot 默认值就可以正常工作。 |
将应用程序部署到 servlet 容器或应用程序服务器时,使用 Java Util 日志记录 API 执行的日志记录不会路由到应用程序的日志中。 这样可以防止容器或已部署到容器的其他应用程序执行的日志记录显示在应用程序的日志中。 |
有很多可用于 Java 的日志框架。 如果上面的列表看起来令人困惑,请不要担心。 通常,您不需要更改日志记录依赖项,Spring Boot 默认值就可以正常工作。 |
将应用程序部署到 servlet 容器或应用程序服务器时,使用 Java Util 日志记录 API 执行的日志记录不会路由到应用程序的日志中。 这样可以防止容器或已部署到容器的其他应用程序执行的日志记录显示在应用程序的日志中。 |
日志格式
Spring Boot 的默认日志输出类似于以下示例:
2024-06-22T03:35:21.138Z INFO 81335 --- [myapp] [ main] o.s.b.d.f.logexample.MyApplication : Starting MyApplication using Java 17.0.11 with PID 81335 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2024-06-22T03:35:21.153Z INFO 81335 --- [myapp] [ main] o.s.b.d.f.logexample.MyApplication : No active profile set, falling back to 1 default profile: "default"
2024-06-22T03:35:24.317Z INFO 81335 --- [myapp] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http)
2024-06-22T03:35:24.362Z INFO 81335 --- [myapp] [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2024-06-22T03:35:24.363Z INFO 81335 --- [myapp] [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.25]
2024-06-22T03:35:24.552Z INFO 81335 --- [myapp] [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2024-06-22T03:35:24.563Z INFO 81335 --- [myapp] [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3268 ms
2024-06-22T03:35:25.818Z INFO 81335 --- [myapp] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/'
2024-06-22T03:35:25.846Z INFO 81335 --- [myapp] [ main] o.s.b.d.f.logexample.MyApplication : Started MyApplication in 5.879 seconds (process running for 6.85)
输出以下项目:
-
日期和时间:毫秒级精度,易于排序。
-
日志级别:、、、或 。
ERROR
WARN
INFO
DEBUG
TRACE
-
进程 ID。
-
用于区分实际日志消息开头的分隔符。
---
-
应用程序名称:用方括号括起来(默认情况下,仅当设置了)Application name: En括在方括号中(默认情况下,仅当设置了此项时才记录)
spring.application.name
-
线程名称:用方括号括起来(对于控制台输出,可以截断)。
-
相关 ID:如果启用了跟踪(上面的示例中未显示)
-
记录器名称:这通常是源类名称(通常缩写)。
-
日志消息。
Logback 没有级别。
它映射到 。FATAL ERROR |
如果您有属性,但不希望将其记录,则可以设置为 。spring.application.name logging.include-application-name false |
Logback 没有级别。
它映射到 。FATAL ERROR |
如果您有属性,但不希望将其记录,则可以设置为 。spring.application.name logging.include-application-name false |
控制台输出
默认日志配置在写入消息时将消息回显到控制台。
默认情况下,将记录 -level、-level 和 -level 消息。
您还可以通过使用标志启动应用程序来启用“调试”模式。ERROR
WARN
INFO
--debug
$ java -jar myapp.jar --debug
您还可以在 .debug=true application.properties |
启用调试模式后,将配置一系列核心记录器(嵌入式容器、Hibernate 和 Spring Boot)以输出更多信息。
启用调试模式不会将应用程序配置为使用 level 记录所有消息。DEBUG
或者,您可以通过使用标志(或在 .
这样做可以对一系列核心记录器(嵌入式容器、Hibernate 模式生成和整个 Spring 产品组合)进行跟踪日志记录。--trace
trace=true
application.properties
颜色编码输出
如果您的终端支持 ANSI,则使用颜色输出来帮助提高可读性。
您可以设置为支持的值以覆盖自动检测。spring.output.ansi.enabled
使用转换词配置颜色编码。
在最简单的形式中,转换器根据日志级别为输出着色,如以下示例所示:%clr
%clr(%5p)
下表描述了日志级别到颜色的映射:
水平 | 颜色 |
---|---|
|
红 |
|
红 |
|
黄色 |
|
绿 |
|
绿 |
|
绿 |
或者,您可以通过将其作为转换选项提供来指定应使用的颜色或样式。 例如,若要使文本变为黄色,请使用以下设置:
%clr(%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}){yellow}
支持以下颜色和样式:
-
blue
-
cyan
-
faint
-
green
-
magenta
-
red
-
yellow
您还可以在 .debug=true application.properties |
水平 | 颜色 |
---|---|
|
红 |
|
红 |
|
黄色 |
|
绿 |
|
绿 |
|
绿 |
文件输出
默认情况下,Spring Boot 仅记录到控制台,不写入日志文件。
如果要在控制台输出之外编写日志文件,则需要设置 or 属性(例如,在 .logging.file.name
logging.file.path
application.properties
下表显示了如何将这些属性一起使用:logging.*
logging.file.name |
logging.file.path |
例 | 描述 |
---|---|---|---|
(无) |
(无) |
仅限控制台日志记录。 |
|
特定文件 |
(无) |
|
写入指定的日志文件。 名称可以是确切的位置,也可以是相对于当前目录的名称。 |
(无) |
特定目录 |
|
写入指定的目录。
名称可以是确切的位置,也可以是相对于当前目录的名称。 |
日志文件在达到 10 MB 时会轮换,并且与控制台输出一样,默认情况下会记录 -level、-level 和 -level 消息。ERROR
WARN
INFO
日志记录属性独立于实际的日志记录基础结构。
因此,Spring Boot不管理特定的配置键(例如Logback)。logback.configurationFile |
logging.file.name |
logging.file.path |
例 | 描述 |
---|---|---|---|
(无) |
(无) |
仅限控制台日志记录。 |
|
特定文件 |
(无) |
|
写入指定的日志文件。 名称可以是确切的位置,也可以是相对于当前目录的名称。 |
(无) |
特定目录 |
|
写入指定的目录。
名称可以是确切的位置,也可以是相对于当前目录的名称。 |
日志记录属性独立于实际的日志记录基础结构。
因此,Spring Boot不管理特定的配置键(例如Logback)。logback.configurationFile |
文件轮换
如果您使用的是 Logback,则可以使用 your 或 file 微调日志轮换设置。
对于所有其他日志记录系统,您需要直接自己配置轮换设置(例如,如果您使用 Log4j2,则可以添加 or 文件)。application.properties
application.yaml
log4j2.xml
log4j2-spring.xml
支持以下轮换策略属性:
名字 | 描述 |
---|---|
|
用于创建日志存档的文件名模式。 |
|
如果应在应用程序启动时进行日志存档清理。 |
|
日志文件存档前的最大大小。 |
|
日志存档在删除之前可以占用的最大大小。 |
|
要保留的最大存档日志文件数(默认为 7)。 |
名字 | 描述 |
---|---|
|
用于创建日志存档的文件名模式。 |
|
如果应在应用程序启动时进行日志存档清理。 |
|
日志文件存档前的最大大小。 |
|
日志存档在删除之前可以占用的最大大小。 |
|
要保留的最大存档日志文件数(默认为 7)。 |
日志级别
所有受支持的日志记录系统都可以在 Spring 中设置记录器级别(例如,in ),方法是使用 where is 是 TRACE、DEBUG、INFO、WARN、ERROR、FATAL 或 OFF 之一。
可以使用 来配置记录器。Environment
application.properties
logging.level.<logger-name>=<level>
level
root
logging.level.root
以下示例显示了 : 中的潜在日志记录设置:application.properties
-
Properties
-
YAML
logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
logging:
level:
root: "warn"
org.springframework.web: "debug"
org.hibernate: "error"
还可以使用环境变量设置日志记录级别。
例如,将设置为 。LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG
org.springframework.web
DEBUG
上述方法仅适用于包级日志记录。
由于宽松绑定始终将环境变量转换为小写,因此无法以这种方式为单个类配置日志记录。
如果需要为类配置日志记录,可以使用 SPRING_APPLICATION_JSON 变量。 |
上述方法仅适用于包级日志记录。
由于宽松绑定始终将环境变量转换为小写,因此无法以这种方式为单个类配置日志记录。
如果需要为类配置日志记录,可以使用 SPRING_APPLICATION_JSON 变量。 |
日志组
能够将相关的记录器组合在一起,以便可以同时配置它们,这通常很有用。 例如,您通常可能会更改所有与 Tomcat 相关的记录器的日志记录级别,但您无法轻松记住顶级包。
为了帮助解决这个问题,Spring Boot 允许您在 Spring .
例如,下面介绍如何通过将“tomcat”组添加到您的Environment
application.properties
-
Properties
-
YAML
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging:
group:
tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"
定义后,您可以使用一行更改组中所有记录器的级别:
-
Properties
-
YAML
logging.level.tomcat=trace
logging:
level:
tomcat: "trace"
Spring Boot 包括以下预定义的日志记录组,这些组可以开箱即用:
名字 | Logging |
---|---|
Web |
|
sql |
|
名字 | Logging |
---|---|
Web |
|
sql |
|
使用日志关闭挂钩
为了在应用程序终止时释放日志记录资源,提供了一个关闭钩子,该钩子将在 JVM 退出时触发日志系统清理。
除非应用程序部署为 war 文件,否则会自动注册此关闭挂钩。
如果应用程序具有复杂的上下文层次结构,则关闭钩子可能无法满足您的需求。
如果没有,请禁用关闭挂钩并调查底层日志记录系统直接提供的选项。
例如,Logback 提供了上下文选择器,允许在自己的上下文中创建每个 Logger。
可以使用该属性禁用关闭挂钩。
将其设置为将禁用注册。
您可以在 or 文件中设置属性:logging.register-shutdown-hook
false
application.properties
application.yaml
-
Properties
-
YAML
logging.register-shutdown-hook=false
logging:
register-shutdown-hook: false
自定义日志配置
可以通过在类路径上包含适当的库来激活各种日志记录系统,并且可以通过在类路径的根目录或以下 Spring 属性指定的位置提供合适的配置文件来进一步自定义:。Environment
logging.config
您可以使用 system 属性强制 Spring Boot 使用特定的日志记录系统。
该值应为实现的完全限定类名。
您还可以使用值 完全禁用 Spring Boot 的日志记录配置。org.springframework.boot.logging.LoggingSystem
LoggingSystem
none
由于日志记录是在创建之前初始化的,因此无法从 Spring 文件中控制日志记录。
更改日志记录系统或完全禁用它的唯一方法是通过系统属性。ApplicationContext @PropertySources @Configuration |
根据您的日志记录系统,将加载以下文件:
测井系统 | 定制 |
---|---|
回溯 |
|
日志4j2 |
|
JDK(Java Util 日志记录) |
|
如果可能,我们建议您将变体用于日志记录配置(例如,而不是 )。
如果使用标准配置位置,Spring 无法完全控制日志初始化。-spring logback-spring.xml logback.xml |
Java Util Logging 存在已知的类加载问题,这些问题会导致从“可执行 jar”运行时出现问题。 如果可能的话,我们建议您在从“可执行 jar”运行时避免使用它。 |
为了帮助进行自定义,将其他一些属性从 Spring 属性转移到 System 属性。
这允许日志记录系统配置来使用属性。例如,在环境变量中设置或设置为环境变量将导致设置 System 属性。
下表描述了传输的属性:Environment
logging.file.name
application.properties
LOGGING_FILE_NAME
LOG_FILE
春季环境 | System 属性 | 评论 |
---|---|---|
|
|
记录异常时使用的转换词。 |
|
|
如果已定义,则在默认日志配置中使用它。 |
|
|
如果已定义,则在默认日志配置中使用它。 |
|
|
要在控制台上使用的日志模式 (stdout)。 |
|
|
日志日期格式的 Appender 模式。 |
|
|
用于控制台日志记录的字符集。 |
|
|
用于控制台日志记录的日志级别阈值。 |
|
|
要在文件中使用的日志模式(如果已启用)。 |
|
|
用于文件日志记录的字符集(如果已启用)。 |
|
|
用于文件日志记录的日志级别阈值。 |
|
|
呈现日志级别时要使用的格式(默认)。 |
|
|
当前进程 ID(如果可能且尚未定义为 OS 环境变量时发现)。 |
如果使用 Logback,还会传输以下属性:
春季环境 | System 属性 | 评论 |
---|---|---|
|
|
滚动日志文件名的模式(默认)。 |
|
|
是否在启动时清理归档日志文件。 |
|
|
最大日志文件大小。 |
|
|
要保留的日志备份的总大小。 |
|
|
要保留的存档日志文件的最大数量。 |
所有受支持的日志记录系统都可以在分析其配置文件时查阅系统属性。
有关示例,请参阅默认配置:spring-boot.jar
如果要在日志记录属性中使用占位符,则应使用 Spring Boot 的语法,而不是基础框架的语法。
值得注意的是,如果使用 Logback,则应使用属性名称与其默认值之间的分隔符,而不是 。 |
您可以将 MDC 和其他临时内容添加到日志行中,方法是仅覆盖 (或使用 Logback)。
例如,如果使用 ,则默认日志格式包含“user”的 MDC 条目(如果存在),如以下示例所示。
|
由于日志记录是在创建之前初始化的,因此无法从 Spring 文件中控制日志记录。
更改日志记录系统或完全禁用它的唯一方法是通过系统属性。ApplicationContext @PropertySources @Configuration |
测井系统 | 定制 |
---|---|
回溯 |
|
日志4j2 |
|
JDK(Java Util 日志记录) |
|
如果可能,我们建议您将变体用于日志记录配置(例如,而不是 )。
如果使用标准配置位置,Spring 无法完全控制日志初始化。-spring logback-spring.xml logback.xml |
Java Util Logging 存在已知的类加载问题,这些问题会导致从“可执行 jar”运行时出现问题。 如果可能的话,我们建议您在从“可执行 jar”运行时避免使用它。 |
春季环境 | System 属性 | 评论 |
---|---|---|
|
|
记录异常时使用的转换词。 |
|
|
如果已定义,则在默认日志配置中使用它。 |
|
|
如果已定义,则在默认日志配置中使用它。 |
|
|
要在控制台上使用的日志模式 (stdout)。 |
|
|
日志日期格式的 Appender 模式。 |
|
|
用于控制台日志记录的字符集。 |
|
|
用于控制台日志记录的日志级别阈值。 |
|
|
要在文件中使用的日志模式(如果已启用)。 |
|
|
用于文件日志记录的字符集(如果已启用)。 |
|
|
用于文件日志记录的日志级别阈值。 |
|
|
呈现日志级别时要使用的格式(默认)。 |
|
|
当前进程 ID(如果可能且尚未定义为 OS 环境变量时发现)。 |
春季环境 | System 属性 | 评论 |
---|---|---|
|
|
滚动日志文件名的模式(默认)。 |
|
|
是否在启动时清理归档日志文件。 |
|
|
最大日志文件大小。 |
|
|
要保留的日志备份的总大小。 |
|
|
要保留的存档日志文件的最大数量。 |
如果要在日志记录属性中使用占位符,则应使用 Spring Boot 的语法,而不是基础框架的语法。
值得注意的是,如果使用 Logback,则应使用属性名称与其默认值之间的分隔符,而不是 。 |
您可以将 MDC 和其他临时内容添加到日志行中,方法是仅覆盖 (或使用 Logback)。
例如,如果使用 ,则默认日志格式包含“user”的 MDC 条目(如果存在),如以下示例所示。
|
日志回扩展
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]]
特定于配置文件的配置
该标记允许您根据活动的 Spring 配置文件选择性地包含或排除配置部分。
配置文件部分在元素内的任何位置都受支持。
使用该属性指定哪个配置文件接受配置。
标记可以包含配置文件名称(例如)或配置文件表达式。
配置文件表达式允许表达更复杂的配置文件逻辑,例如 。
有关更多详细信息,请查看 Spring Framework 参考指南。
以下列表显示了三个示例配置文件:<springProfile>
<configuration>
name
<springProfile>
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>
环境属性
该标记允许您公开 Spring 中的属性以在 Logback 中使用。
如果要在 Logback 配置中访问文件中的值,则这样做会很有用。
该标签的工作方式与 Logback 的标准标签类似。
但是,与其指定直接 ,不如指定 的属性(从 )。
如果需要将属性存储在范围之外的某个位置,则可以使用该属性。
如果需要回退值(以防未在 中设置该属性),则可以使用该属性。
以下示例演示如何公开属性以在 Logback 中使用:<springProperty>
Environment
application.properties
<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>
在烤肉串的情况下必须指定(例如)。
但是,可以使用宽松的规则将属性添加到 中。source my.property-name Environment |
由于标准配置文件加载得太早,因此不能在其中使用扩展名。
您需要使用或定义属性。logback.xml logback-spring.xml logging.config |
这些扩展不能与 Logback 的配置扫描一起使用。 如果尝试这样做,则对配置文件进行更改将导致记录类似于以下错误之一的错误: |
在烤肉串的情况下必须指定(例如)。
但是,可以使用宽松的规则将属性添加到 中。source my.property-name Environment |
Log4j2 扩展
Spring Boot 包含许多对 Log4j2 的扩展,可以帮助进行高级配置。
您可以在任何配置文件中使用这些扩展名。log4j2-spring.xml
由于标准配置文件加载得太早,因此不能在其中使用扩展名。
您需要使用或定义属性。log4j2.xml log4j2-spring.xml logging.config |
这些扩展取代了 Log4J 提供的 Spring Boot 支持。
应确保不要在生成中包含该模块。org.apache.logging.log4j:log4j-spring-boot |
特定于配置文件的配置
该标记允许您根据活动的 Spring 配置文件选择性地包含或排除配置部分。
配置文件部分在元素内的任何位置都受支持。
使用该属性指定哪个配置文件接受配置。
标记可以包含配置文件名称(例如)或配置文件表达式。
配置文件表达式允许表达更复杂的配置文件逻辑,例如 。
有关更多详细信息,请查看 Spring Framework 参考指南。
以下列表显示了三个示例配置文件:<SpringProfile>
<Configuration>
name
<SpringProfile>
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>
环境属性查找
如果要在 Log4j2 配置中引用 Spring 中的属性,则可以使用前缀查找。
如果要在 Log4j2 配置中访问文件中的值,则这样做非常有用。Environment
spring:
application.properties
下面的示例显示了如何设置一个名为 Log4j2 的属性,该属性从 Spring 读取:applicationName
spring.application.name
Environment
<Properties>
<Property name="applicationName">${spring:spring.application.name}</Property>
</Properties>
在烤肉串的情况下应指定查找键(例如)。my.property-name |
Log4j2 系统属性
Log4j2 支持许多可用于配置各种项目的系统属性。
例如,system 属性可用于配置是否将在 Windows 上尝试使用 Jansi 输出流。log4j2.skipJansi
ConsoleAppender
Log4j2 初始化后加载的所有系统属性都可以从 Spring 获取。
例如,您可以添加到文件中以在 Windows 上使用 Jansi。Environment
log4j2.skipJansi=false
application.properties
ConsoleAppender
仅当系统属性和操作系统环境变量不包含要加载的值时,才会考虑 Spring。Environment |
在早期 Log4j2 初始化期间加载的系统属性不能引用 Spring 。
例如,在 Spring 环境可用之前,将使用 Log4j2 用于允许选择默认 Log4j2 实现的属性。Environment |
由于标准配置文件加载得太早,因此不能在其中使用扩展名。
您需要使用或定义属性。log4j2.xml log4j2-spring.xml logging.config |
这些扩展取代了 Log4J 提供的 Spring Boot 支持。
应确保不要在生成中包含该模块。org.apache.logging.log4j:log4j-spring-boot |
在烤肉串的情况下应指定查找键(例如)。my.property-name |
仅当系统属性和操作系统环境变量不包含要加载的值时,才会考虑 Spring。Environment |
在早期 Log4j2 初始化期间加载的系统属性不能引用 Spring 。
例如,在 Spring 环境可用之前,将使用 Log4j2 用于允许选择默认 Log4j2 实现的属性。Environment |