Spring Boot使用Commons Logging(Apache的一个软件)记录所有的内部日志,但是使底层日志实现保持打开状态。提供了Java Util Logging、Log4J2和Logback的默认配置。在每种情况下,记录器都已预先配置为使用控制台输出,同时还提供可选的文件输出。
默认情况下,如果使用“启动器(Starters)”,则使用Logback记录日志。还引入了适当的Logback路由,以确保使用Java Util Logging、Commons Logging、Log4J或SLF4J的依赖库都可以正常工作。
有许多可用于Java的日志记录框架。如果上面罗列的列表看起来令人困惑,请不要担心。通常,您不需要更改日志记录的依赖性,并且Spring Boot默认值可以正常工作。
当您将应用程序部署到servlet容器或应用程序服务器时,通过Java Util Logging API执行的日志记录不会路由到应用程序的日志中。这样可以防止由容器或已部署到容器中的其他应用程序执行的日志记录出现在应用程序的日志中。
4.1 日志格式
Spring Boot的默认日志输出类似于以下所示:
2019-03-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52
2019-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2019-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1358 ms
2019-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2019-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.2 控制台输出
默认日志配置在写入消息时将消息输出到控制台。默认情况下,将记录ERROR
、WARN
和INFO
级别的消息。还可以通过使用--debug
标志启动应用程序,启用“调试”模式。
$ java -jar myapp.jar --debug
您也可以在
application.properties
中指定debug=true
来开启“调试”模式。
启用调试模式后,将配置一些核心记录器(嵌入式容器、Hibernate和Spring Boot)以输出更多信息。启用调试模式并没有配置您的应用程序记录所有DEBUG
级别的消息。
另外,您可以通过使用--trace
标志(或在application.properties
中设置trace=true
)启动应用程序,启用“跟踪”模式。这样做可以为某些核心记录器(嵌入式容器、Hibernate模式生成(schema generation)以及整个Spring产品组合)启用跟踪记录。
4.2.1 带颜色的编码输出
如果您的终端支持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.3 文件输出
默认情况下,Spring Boot仅在控制台输出日志,而不写入日志文件。如果除了控制台输出外还想写入日志文件,则需要设置logging.file.name
或logging.file.path
属性(例如,在application.properties
中设置)。
下表显示了如何将这些logging.*
属性组合使用:
表5.日志记录属性
logging.file.name |
logging.file.path |
示例 | 描述 |
---|---|---|---|
(none) | (none) | 仅在控制台中记录。 | |
特定文件 | (none) | my.log |
写入指定的日志文件。名称可以是确切的位置,也可以是相对于当前目录的位置。 |
(none) | 具体目录 | /var/log |
在指定的目录写入spring.log 。名称可以是确切的位置,也可以是相对于当前目录的位置。 |
日志文件达到10 MB时会轮转,并且与控制台输出一样,默认情况下会记录ERROR
、WARN
和INFO
级别的消息。
日志记录属性与实际的日志记录基础结构无关。这导致,Spring Boot不会管理特定基础结构的配置的key(例如Logback的
logback.configurationFile
属性)。
4.4 文件轮转
如果您使用的是Logback,则可以使用application.properties
或application.yaml
文件微调日志轮转设置。对于其他所有的日志记录系统,您需要直接自己配置轮转设置(例如,如果使用Log4J2,则可以添加log4j.xml
文件)。
支持以下的轮转策略属性:
名称 | 描述 |
---|---|
logging.logback.rollingpolicy.file-name-pattern |
用于创建日志归档的文件名模式。 |
logging.logback.rollingpolicy.clean-history-on-start |
在应用程序启动时,对日志归档清理。 |
logging.logback.rollingpolicy.max-file-size |
归档前日志文件的最大尺寸。 |
logging.logback.rollingpolicy.total-size-cap |
删除日志档案之前可以保存的最大尺寸总量。 |
logging.logback.rollingpolicy.max-history |
保留日志存档的天数(默认为7天)。 |
4.5 日志级别
在SpringEnvironment
中(例如,在application.properties中),所有支持的日志系统都可以设置日志级别,通过使用logging.level.<logger-name>=<level>
进行设置。其中<level>
可以是TRACE、DEBUG、INFO、WARN、ERROR、FATAL或者OFF之一。root
记录器可以通过logging.level.root
配置。
以下示例显示了application.properties
中潜在的日志记录设置:
Properties:
logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
Yaml:
logging:
level:
root: "warn"
org.springframework.web: "debug"
org.hibernate: "error"
也可以使用环境变量来设置日志记录级别。例如,LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG
将设置org.springframework.web
为DEBUG
。
以上方法仅适用于程序包级别的日志记录。由于宽松绑定总是将环境变量转换为小写,因此无法以这种方式为单个类配置日志记录。如果需要为类配置日志记录,则可以使用
SPRING_APPLICATION_JSON
变量。
4.6 日志组
能够将相关记录器分组使用通常很有用,以便可以同时配置它们。例如,通常您可能会更改所有与Tomcat相关的记录器的记录级别,但是并不容易记住顶层软件包。
为了解决这个问题,Spring Boot允许您在SpringEnvironment
中定义日志记录组。例如,下面是怎样定义“ tomcat”组并将其添加到您的application.properties
中的方式:
Properties:
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
Yaml:
logging:
group:
tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"
定义后,您可以使用一行更改该组中所有记录器的级别:
Properties:
logging.level.tomcat=trace
Yaml:
logging:
level:
tomcat: "trace"
Spring Boot包含如下预定义的日志记录组,它们可以直接使用:
名称 | 记录器 |
---|---|
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.7 自定义日志配置
可以通过在类路径中包括适当的库来激活各种日志记录系统,并可以通过在类路径的根目录或以下SpringEnvironment
属性指定的位置中提供适当的配置文件来进一步自定义各种日志记录系统logging.config
。
您可以通过使用org.springframework.boot.logging.LoggingSystem
system属性来强制Spring Boot使用特定的日志记录系统。该值应该是实现的完全限定的类名LoggingSystem
。您还可以通过使用值完全禁用Spring Boot的日志记录配置none
。
由于日志记录是在
ApplicationContext
创建之前初始化的,因此无法从@PropertySources
Spring@Configuration
文件中控制日志记录。更改日志记录系统或完全禁用它的唯一方法是通过系统属性。
根据您的日志记录系统,将加载以下文件:
测井系统 | 客制化 |
---|---|
退回 | logback-spring.xml ,logback-spring.groovy ,logback.xml ,或者logback.groovy |
Log4j2 | log4j2-spring.xml 要么 log4j2.xml |
JDK(Java实用程序日志记录) | logging.properties |
如果可能,我们建议您将
-spring
变体用于日志记录配置(例如,logback-spring.xml
而不是logback.xml
)。如果使用标准配置位置,Spring将无法完全控制日志初始化。从“可执行jar”运行时,Java Util Logging存在一些已知的类加载问题,这些问题会引起问题。我们建议您尽可能从“可执行jar”运行时避免使用它。
为了帮助进行定制,Environment
如下表所述,一些其他属性从Spring转移到System属性:
Spring环境 | 系统属性 | 批注 |
---|---|---|
logging.exception-conversion-word |
LOG_EXCEPTION_CONVERSION_WORD |
记录异常时使用的转换字。 |
logging.file.name |
LOG_FILE |
如果定义,它将在默认日志配置中使用。 |
logging.file.path |
LOG_PATH |
如果定义,它将在默认日志配置中使用。 |
logging.pattern.console |
CONSOLE_LOG_PATTERN |
控制台上使用的日志模式(stdout)。 |
logging.pattern.dateformat |
LOG_DATEFORMAT_PATTERN |
记录日期格式的附加模式。 |
logging.charset.console |
CONSOLE_LOG_CHARSET |
用于控制台日志记录的字符集。 |
logging.pattern.file |
FILE_LOG_PATTERN |
文件中使用的日志模式(如果LOG_FILE 已启用)。 |
logging.charset.file |
FILE_LOG_CHARSET |
用于文件记录的字符集(如果LOG_FILE 已启用)。 |
logging.pattern.level |
LOG_LEVEL_PATTERN |
呈现日志级别时使用的格式(默认%5p )。 |
PID |
PID |
当前进程ID(如果可能,并且尚未将其定义为OS环境变量时发现)。 |
如果您使用的是Logback,还将传输以下属性:
Spring环境 | 系统属性 | 批注 |
---|---|---|
logging.logback.rollingpolicy.file-name-pattern |
LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN |
过渡日志文件名的模式(默认${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz )。 |
logging.logback.rollingpolicy.clean-history-on-start |
LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START |
是否在启动时清除存档日志文件。 |
logging.logback.rollingpolicy.max-file-size |
LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE |
最大日志文件大小。 |
logging.logback.rollingpolicy.total-size-cap |
LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP |
要保留的日志备份的总大小。 |
logging.logback.rollingpolicy.max-history |
LOGBACK_ROLLINGPOLICY_MAX_HISTORY |
要保留的最大归档日志文件数。 |
所有受支持的日志记录系统在解析其配置文件时都可以查阅系统属性。有关spring-boot.jar
示例,请参见中的默认配置:
如果要在日志记录属性中使用占位符,则应使用Spring Boot的语法而不是基础框架的语法。值得注意的是,如果您使用Logback,则应将其
:
用作属性名称与其默认值之间的分隔符,而不应使用:-
。您可以通过仅覆盖
LOG_LEVEL_PATTERN
(或logging.pattern.level
使用Logback)将MDC和其他临时内容添加到日志行。例如,如果使用logging.pattern.level=user:%X{user} %5p
,则默认日志格式包含“ user”的MDC条目(如果存在),如以下示例所示:2019-08-30 12:30:04.031 user:someone INFO 22174 --- [ nio-8080-exec-0] demo.Controller Handling authenticated request
4.8 登录扩展
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.8.1 特定于配置文件的配置
使用<springProfile>
标签,您可以根据活动的Spring配置文件选择包括或排除配置部分。概要文件部分在<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>
4.8.2 环境特性
该<springProperty>
标签可以让你从Spring公开属性Environment
的范围内的logback使用。如果要从application.properties
Logback配置中访问文件中的值,则这样做很有用。该标签的工作方式类似于Logback的标准<property>
标签。但是,value
您无需指定direct,而是可以指定source
属性的(来自Environment
)。如果需要将属性存储在local
范围之外的其他位置,则可以使用该scope
属性。如果需要后备值(如果未在中设置属性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
使用宽松规则将属性添加到中。