Spring Boot使用Commons Logging(Apache的一个软件)记录所有的内部日志,但是使底层日志实现保持打开状态。提供了Java Util LoggingLog4J2Logback的默认配置。在每种情况下,记录器都已预先配置为使用控制台输出,同时还提供可选的文件输出。
默认情况下,如果使用“启动器(Starters)”,则使用Logback记录日志。还引入了适当的Logback路由,以确保使用Java Util Logging、Commons Logging、Log4J或SLF4J的依赖库都可以正常工作。

灯泡.svg 有许多可用于Java的日志记录框架。如果上面罗列的列表看起来令人困惑,请不要担心。通常,您不需要更改日志记录的依赖性,并且Spring Boot默认值可以正常工作。

灯泡.svg 当您将应用程序部署到servlet容器或应用程序服务器时,通过Java Util Logging API执行的日志记录不会路由到应用程序的日志中。这样可以防止由容器或已部署到容器中的其他应用程序执行的日志记录出现在应用程序的日志中。

4.1 日志格式

Spring Boot的默认日志输出类似于以下所示:

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

输出以下项包含:

  • 日期和时间:毫秒级精度,易于排序。
  • 日志级别:ERRORWARNINFODEBUGTRACE
  • 进程ID。
  • 用“---”分离器来区分实际日志消息的开始。
  • 线程名称:用方括号括起来(对于控制台输出,可能会被截断)。
  • 记录器名称:这通常是源码的类名称(通常缩写)。
  • 日志消息。

info.svg Logback没有FATAL级别,它被映射到ERROR级别。

4.2 控制台输出

默认日志配置在写入消息时将消息输出到控制台。默认情况下,将记录ERRORWARNINFO级别的消息。还可以通过使用--debug标志启动应用程序,启用“调试”模式。

  1. $ java -jar myapp.jar --debug

info.svg 您也可以在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转换字符来配置颜色编码。转换器以最简单的形式根据日志级别转换输入着色,如下所示:

  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

4.3 文件输出

默认情况下,Spring Boot仅在控制台输出日志,而不写入日志文件。如果除了控制台输出外还想写入日志文件,则需要设置logging.file.namelogging.file.path属性(例如,在application.properties中设置)。

下表显示了如何将这些logging.*属性组合使用:
表5.日志记录属性

logging.file.name logging.file.path 示例 描述
(none) (none) 仅在控制台中记录。
特定文件 (none) my.log 写入指定的日志文件。名称可以是确切的位置,也可以是相对于当前目录的位置。
(none) 具体目录 /var/log 在指定的目录写入spring.log。名称可以是确切的位置,也可以是相对于当前目录的位置。

日志文件达到10 MB时会轮转,并且与控制台输出一样,默认情况下会记录ERRORWARNINFO级别的消息。

灯泡.svg 日志记录属性与实际的日志记录基础结构无关。这导致,Spring Boot不会管理特定基础结构的配置的key(例如Logback的logback.configurationFile属性)。

4.4 文件轮转

如果您使用的是Logback,则可以使用application.propertiesapplication.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:

  1. logging.level.root=warn
  2. logging.level.org.springframework.web=debug
  3. logging.level.org.hibernate=error

Yaml:

  1. logging:
  2. level:
  3. root: "warn"
  4. org.springframework.web: "debug"
  5. org.hibernate: "error"

也可以使用环境变量来设置日志记录级别。例如,LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG将设置org.springframework.webDEBUG

info.svg 以上方法仅适用于程序包级别的日志记录。由于宽松绑定总是将环境变量转换为小写,因此无法以这种方式为单个类配置日志记录。如果需要为类配置日志记录,则可以使用SPRING_APPLICATION_JSON变量。

4.6 日志组

能够将相关记录器分组使用通常很有用,以便可以同时配置它们。例如,通常您可能会更改所有与Tomcat相关的记录器的记录级别,但是并不容易记住顶层软件包。
为了解决这个问题,Spring Boot允许您在SpringEnvironment中定义日志记录组。例如,下面是怎样定义“ tomcat”组并将其添加到您的application.properties中的方式:
Properties:

  1. logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat

Yaml:

  1. logging:
  2. group:
  3. tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"

定义后,您可以使用一行更改该组中所有记录器的级别:
Properties:

  1. logging.level.tomcat=trace

Yaml:

  1. logging:
  2. level:
  3. 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.LoggingSystemsystem属性来强制Spring Boot使用特定的日志记录系统。该值应该是实现的完全限定的类名LoggingSystem。您还可以通过使用值完全禁用Spring Boot的日志记录配置none

info.svg 由于日志记录是ApplicationContext创建之前初始化的,因此无法从@PropertySourcesSpring@Configuration文件中控制日志记录。更改日志记录系统或完全禁用它的唯一方法是通过系统属性。

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

测井系统 客制化
退回 logback-spring.xmllogback-spring.groovylogback.xml,或者logback.groovy
Log4j2 log4j2-spring.xml 要么 log4j2.xml
JDK(Java实用程序日志记录) logging.properties

info.svg 如果可能,我们建议您将-spring变体用于日志记录配置(例如,logback-spring.xml而不是logback.xml)。如果使用标准配置位置,Spring将无法完全控制日志初始化。

警告.svg 从“可执行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示例,请参见中的默认配置:

灯泡.svg 如果要在日志记录属性中使用占位符,则应使用Spring Boot的语法而不是基础框架的语法。值得注意的是,如果您使用Logback,则应将其:用作属性名称与其默认值之间的分隔符,而不应使用:-

灯泡.svg 您可以通过仅覆盖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配置文件中使用这些扩展名。

info.svg 由于标准logback.xml配置文件加载太早,因此您不能在其中使用扩展名。您需要使用logback-spring.xml或定义一个logging.config属性。

警告.svg 这些扩展不能与Logback的配置扫描一起使用。如果尝试这样做,则对配置文件进行更改将导致类似于以下记录之一的错误:

  1. ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]]
  2. 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)。有关更多详细信息,请参阅参考指南。以下清单显示了三个样本概要文件:

  1. <springProfile name="staging">
  2. <!-- configuration to be enabled when the "staging" profile is active -->
  3. </springProfile>
  4. <springProfile name="dev | staging">
  5. <!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
  6. </springProfile>
  7. <springProfile name="!production">
  8. <!-- configuration to be enabled when the "production" profile is not active -->
  9. </springProfile>

4.8.2 环境特性

<springProperty>标签可以让你从Spring公开属性Environment的范围内的logback使用。如果要从application.propertiesLogback配置中访问文件中的值,则这样做很有用。该标签的工作方式类似于Logback的标准<property>标签。但是,value您无需指定direct,而是可以指定source属性的(来自Environment)。如果需要将属性存储在local范围之外的其他位置,则可以使用该scope属性。如果需要后备值(如果未在中设置属性Environment),则可以使用defaultValue属性。以下示例显示如何公开用于Logback的属性:

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

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