一、logging
Spring Boot使用Commons Logging
记录内部的日志,但是开放了底层日志的接口实现。提供了Java Util Logging
,Log4J2
和Logback
的默认配置。 在每种情况下,记录器都已预先配置为使用控制台输出,也可以打印到文件中。
默认情况下,如果使用“starters”,则使用Logback进行日志记录。 还包括适当的Logback路由,以确保使用Java Util Logging
,Commons Logging
,Log4J
或SLF4J
的依赖库都能正常工作。
Java有许多的日志记录框架。 如果上面的列表看起来令人困惑,请不要担心。 通常,您不需要更改日志记录依赖项,Spring Boot的日志记录默认就可以工作。
将应用程序部署到servlet容器或应用程序服务器时,通过Java Util Logging API
执行的日志记录不会路由到应用程序的日志中。 这样可以防止容器或其他已部署到容器中的应用的日志记录出现在当前部署的应用程序的日志中。
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
,DEBUG
和TRACE
- 进程ID。
- 一个
---
分隔符,用于区分实际日志消息的开始。 - 线程名称:用方括号括起来(输出可能会被控制台截断)。
- 记录器名称:这通常是源类名称(通常缩写)。
- 日志消息。
Logback没有FATAL
级别。 它映射到ERROR
。
2、控制台输出
默认日志配置在写入消息时将消息回显到控制台。 默认情况下,将记录ERROR
级,WARN
级和INFO
级消息。 您还可以通过使用--debug标志启动应用程序来启用“调试”模式。
$ java -jar myapp.jar --debug
你也可以在application.properties
中指定debug=true
启用调试模式后,将配置一些核心记录器(嵌入式容器,Hibernate和Spring Boot)以输出更多信息。 启用调试模式不会将所有的消息都以DEBUG
级别记录。
另外,您可以通过使用--trace
标志(或application.properties
中的trace = true
)启动应用程序来启用“跟踪”模式。 这样做可以为某些核心记录器(嵌入式容器,Hibernate模式生成以及整个Spring产品组合)启用跟踪记录。
1、彩色编码输出
如果您的终端支持ANSI,则使用彩色输出来提高可读性。 您可以将spring.output.ansi.enabled
设置为支持的值,以覆盖自动检测。
使用%clr转换字配置颜色编码。 转换器以最简单的形式根据日志级别输出着色,如以下示例所示:
%clr(%5p)
下表描述了日志级别到颜色的映射:
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
3、文件输出
默认情况下,Spring Boot只记录到控制台,不写日志文件。 如果除了控制台输出外还想写日志文件,则需要设置logging.file.name
或logging.file.path
属性(在application.properties
中)。
下表显示了logging.*
属性如何一起使用:
logging.file.name |
logging.file.path |
Example | Description |
---|---|---|---|
(none) | (none) | 只记录在控制台 | |
Specific file | (none) | my.log |
写入指定的日志文件。 名称可以是确切的位置,也可以相对于当前目录。 |
(none) | Specific directory | /var/log |
将spring.log 写入指定目录。 名称可以是确切的位置,也可以相对于当前目录。 |
日志文件达到10 MB时会切分,并且与控制台输出一样,默认情况下会记录ERROR
级别,WARN
级别和INFO
级别的消息。 可以使用logging.file.max-size
属性更改大小限制。 除非已设置logging.file.max-history
属性,否则默认情况下将保留最近7天的日志文件。 可以使用logging.file.total-size-cap
限制日志归档文件的总大小。 当日志归档的总大小超过该阈值时,将删除备份。 要在应用程序启动时强制清除日志存档,请使用logging.file.clean-history-on-start
属性。
日志记录属性独立于实际的日志记录基础结构。 结果,特定的配置键(例如Logback的logback.configurationFile
)不是由Spring Boot管理的。
4、日志级别
通过使用logging.level.<logger-name> = <level>
,可以在Spring环境中(例如,在application.properties
中)设置所有受支持的日志记录器级别。,其中level
是TRACE,DEBUG,INFO, WARN,ERROR,FATAL或OFF。 可以使用logging.level.root
配置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
变量。
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包含以下预定义的日志记录组,它们可以直接使用:
Name | 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 |
6、自定义日志配置
可以通过在类路径上包含适当的库来激活各种日志记录系统,并可以通过在类路径的根目录或以下Spring Environment
属性指定的位置中提供适当的配置文件来进一步自定义日志文件:logging.config
。
您可以通过使用org.springframework.boot.logging.LoggingSystem
系统属性来强制Spring Boot使用特定的日志记录系统。 该值应该是LoggingSystem
实现的全类名。 您也可以使用none
禁用Spring Boot的日志记录配置。
由于日志记录是在创建ApplicationContext
之前初始化的,因此无法从Spring @Configuration
文件中的@PropertySources
控制日志记录。 更改日志记录系统或完全禁用它的唯一方法是通过系统属性。
根据您的日志记录系统,将加载以下文件:
Logging System | Customization |
---|---|
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 Boot就会自动使用文件里的日志配置以及相应的日志系统。
建议使用logback-spring.xml
格式而不是logback.xml
7、Logback扩展
Spring Boot包含许多Logback扩展,可以帮助进行高级配置。 您可以在logback-spring.xml
配置文件中使用这些扩展。
由于标准logback.xml
配置文件加载得太早,因此无法在其中使用扩展。 您需要使用logback-spring.xml
或定义logging.config
属性。
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>
2、环境属性
<springProperty>
标记使您可以从Spring Environment
中公开属性,以在Logback中使用。 如果要在Logback配置中使用的application.properties
文件中的值,则这样做很有用。 该标签的工作方式类似于Logback的标准<property>
标签。 但是不是直接指定value
,而是指定属性源(从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
中。