Logging

Spring Boot使用Commons Logging进行所有内部日志记录,但保留底层日志实现。为Java Util LoggingLog4J2Logback提供了默认配置 。在每种情况下,记录器都预先配置为使用控制台输出,并且还提供可选的文件输出。

默认情况下,如果使用“Starters”,则使用Logback进行日志记录。还包括适当的Logback路由,以确保使用Java Util Logging,Commons Logging,Log4J或SLF4J的依赖库都能正常工作。

Java有很多日志框架可供使用。如果以上列表看起来令人困惑,请不要担心。通常,您不需要更改日志记录依赖项,并且Spring Boot默认值可以正常工作。

日志格式

1
2
3
4
5
2014-03-05 10:57:51.112  INFO 45469 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.52
2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1358 ms
2014-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2014-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]

输出以下信息:

  • 日期和时间:毫秒精度,易于排序。
  • 日志级别:ERRORWARNINFODEBUG,或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.filelogging.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.configurationFilespring 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
2
3
logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR

日志组

能够将相关记录器组合在一起以便可以同时配置它们通常很有用。例如,您通常可以更改所有 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.codecorg.springframework.httporg.springframework.web
SQL org.springframework.jdbc.coreorg.hibernate.SQL

自定义日志配置

可以通过在类路径中包含适当的库来激活各种日志记录系统,并且可以通过在类路径的根目录中或在以下Spring Environment 属性指定的位置提供合适的配置文件来进一步自定义:logging.config

您可以使用org.springframework.boot.logging.LoggingSystem系统属性强制Spring Boot使用特定的日志记录系统 。该值应该是实现的完全限定类名LoggingSystem。您还可以通过使用值来完全禁用Spring Boot的日志记录配置none

由于记录被初始化之前ApplicationContext创建,这是不可能控制来自伐木@PropertySources春季@Configuration文件。更改日志记录系统或完全禁用它的唯一方法是通过系统属性。

根据您的日志记录系统,将加载以下文件:

日志实现 定制
logback logback-spring.xmllogback-spring.groovylogback.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
2
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]]

特定于配置文件的配置

<springProfile>标签可以让你选择性地包括或排除基于主动春型材配置的部分。在<configuration>元素内的任何位置都支持配置文件节。使用该name属性指定哪个配置文件接受配置。所述<springProfile>标记可包含一个简单的配置文件的名称(例如staging)或轮廓表达。例如,简档表达式允许表达更复杂的简档逻辑 production & (eu-central | eu-west)。有关详细信息,请查阅 参考指南。以下清单显示了三个示例配置文件:

1
2
3
4
5
6
7
8
9
10
11
<springProfile  name = “staging” > 
< - “暂存”配置文件处于活动状态时要启用的配置 - >
</ springProfile>

<springProfile name = “dev | staging” >
< - 在“dev”或“staging”配置文件处于活动状态时启用的配置 - >
</ springProfile>

<springProfile name = “!production” >
< - “生产”配置文件未激活时要启用的配置 - >
</ springProfile>

环境属性

<springProperty>标记允许您公开Spring中的属性Environment以便在Logback中使用。如果要application.properties在Logback配置中访问文件中的值,则此操作非常有用 。标签的工作方式与Logback的标准<property>标签类似。但是,value您可以指定source属性(来自Environment),而不是指定直接 属性。如果需要将属性存储在local范围之外的其他位置,则可以使用该scope 属性。如果需要回退值(如果未在中设置属性 Environment),则可以使用该defaultValue属性。以下示例显示如何公开在Logback中使用的属性:

1
2
3
4
5
6
<springProperty  scope = “context”  name = “fluentHost”  source = “myapp.fluentd.host” 
defaultValue = “localhost” />
<appender name=“FLUENT” class=“ch.qos.logback.more.appenders.DataFluentAppender” >
<remoteHost> $ {fluentHost} </ remoteHost>
...
</springProperty>

source必须在串的情况下(如指定my.property-name)。但是,可以Environment使用宽松规则将属性添加到属性中。