SpringBoot 内部使用 Commons Logging 日志记录器但是保留的对外扩展功能。默认提供 Java Util Logging、Log4j2、Logback。为Java Util日志记录、Log4J2和Logback提供了默认配置。在每种情况下,日志记录器都预先配置为使用控制台输出,并提供可选的文件输出。
默认,如果你使用 starters,使用 logback 进行日志记录。还包括适当的Logback路由,以确保使用Java Util Logging,Commons Logging,Log4J或SLF4J的从属库均能正常工作
Java有很多可用的日志记录框架。如果上面的列表看起来很混乱,不要担心。通常,您不需要更改日志依赖项,Spring引导默认设置也可以正常工作。
当您将应用程序部署到servlet容器或应用程序服务器时,通过Java Util日志API执行的日志记录不会被路由到应用程序的日志中。这可以防止容器或已部署到容器的其他应用程序执行的日志记录出现在应用程序的日志中。
4.1 Log Format
默认日志输出内容如下所示:
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: [/*]
- 日期和时间 精确到毫秒值
- Log Level - ERROR、WARN、INFO、DEBUG、TRACE
- Process ID - 进程ID
- -- 分隔符
- Thread name - 线程名
- Logger name - 消息打印的类名
- log message - 日志内容
Logback 没有 FATAL 级别,使用 ERROR 替代
4.2 Console Output
默认的日志配置将信息打印到控制台。默认情况下会记录 ERROR,WARN,INFO 级别的消息。你可以在启动应用程序时使用 --debug 命令来启动 debug 模式。
$ java -jar myapp.jar --debug
也可以在 application.properties 中设置 debug=true
当启用 debug 模式时,一组核心记录器会配置打印出更多的信息。Enabling the debug mode does not configure your application to log all messages with DEBUG level.
或者你可以选择启用 trace 模式,通过命令行的 --trace 或者 在 application.properties 中添加 trace=true。Doing so enables trace logging for a selection of core loggers (embedded container, Hibernate schema generation, and the whole Spring portfolio).
4.2.1 Color-coded Output
如果你的 命令行知识 ANSI 编码,可以输出带有颜色的日志以便提高可读性。你可以使用 spring.output.ansi.enabled = ALWAYS|DETECT|NEVER 的值来重写自动检测。
颜色编码是通过使用%clr转换字来配置的。在其最简单的形式中,转换器根据日志级别对输出进行着色,如下面的示例所示:
%clr(%5p)
The following table describes the mapping of log levels to colors:
Level | Color |
---|---|
FATAL | Red |
ERROR | Red |
WARN | Yellow |
INFO | Green |
DEBUG | Green |
TRACE | Green |
或者,您可以指定应该使用的颜色或样式,将其作为转换的选项提供。例如,要使文本变为黄色,请使用以下设置
The following colors and styles are supported:
-blue
-cyan
-faint
-green
-magenta
-red
-yellow
4.3 File Output
默认,SpringBoot 只将日志打印到控制台没有写到日志文件。如果你想同时写到配置文件,你需要 配置 logging.file.name 或者 logging.file.path 属性 到你的 application.properties。
The following table shows how the logging.* properties can be used together:
下列表格显示 logging.* 属性如何一起使用。
Table 4. Logging properties
logging.file.name | logging.file.path | Example | Description |
---|---|---|---|
none | none | Console only logging. | |
Specific file | none | my.log | 将日志写到指定的文件,名称可以是确定的位置或者当前目录 |
none | Specific directory | /var/log | 将 spring.log 写入指定的目录。名称可以是确切的位置或相对于当前目录 |
和控制台输出一样,日志文件到达 10M 的时候就会进行轮转,日志文件的大小可以使用 logging.file.max-size 属性指定。日志默认会保持7天在设置 logging.file.max-history 属性之前。归档日志的总大小可以使用 logging.file.total-size-cap 属性来设置。当日志总大小超出阈值时,备份的文件将会被删除。程序启动强制删除归档日志可以使用 logging.file.clean-history-on-start 属性。
属性 | 说明 |
---|---|
logging.file.max-size | 单个文件的大小 |
logging.file.max-history | 日志保存时间 |
logging.file.total-size-cap | 归档日志大小 |
logging.file.clean-history-on-start | 程序启动是否强制删除日志 |
日志属性独立于实际的日志基础结构,一些特定的配置属性不属于 springBoot 管理
4.4 Log Levels
所有支持的日志系统都可以通过 Spring Environment 进行日志级别的设置。在 application.properties 中可以使用 logging.level.<logger-name>=<level> 设置日志级别,日志级别可以是 TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF. 根日志可以使用 logging.level.root 属性设置。
The following example shows potential logging settings in application.properties:
logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
也可以通过 环境变量(Environment variables)来设置日志的级别,比如 LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG 可以设置 org.springframework.web to DEBUG
上面的方法只适用于包级别的日志记录。由于宽松的绑定机制总是将环境变量(evnironment variables)转换为小写形式,因此不可能以这种方式为单个类配置日志记录。如果需要为类配置日志记录,可以使用SPRING_APPLICATION_JSON变量。
4.5 Log Groups
能够将相关的日志记录器分组在一起,以便能够同时对它们进行配置,这通常是很有用的。例如,您通常可能会更改所有与Tomcat相关的日志记录程序的日志级别,但是您无法轻松记住顶级的包。
为了帮助实现这一点,Spring Boot允许您在Spring环境中定义日志组。例如,下面介绍如何通过将tomcat组添加到application.properties中来定义它
logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat
一旦定义了分组,你便可以通过分组改变分组内所有相关的日志级别。
logging.level.tomcat=TRACE
SpringBoot 提供了下表中开箱即用的日志分组:
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 |
4.6 Custom Log Configuration
可以通过在类路径中包含适当的库来激活各种日志系统,还可以通过在类路径的根目录中提供适当的配置文件或在Spring环境的以下属性指定的位置提供适当的配置文件来进一步定制日志系统:logging.config。
你可以使用 org.springframework.boot.logging.LoggingSystem 属性来强制执行 SpringBoot 使用一个日志系统。它的值是一个 LoggingSystem 接口实现类的全限定名。你可以使用 none 彻底关闭 SpringBoot 的日志配置。
日志记录是在 ApplicationContext 创建之前初始化,所以你不可以通过 @Configuration 配置文件的 @PropertySouce 注解进行控制。唯一控制日志记录或禁用的途径是通过 System properties。
根据日志系统的不同会加载不同的配置文件:
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 后缀的配置文件。如果使用标准配置位置,Spring将无法完全控制日志初始化.
There are known classloading issues with Java Util Logging that cause problems when running from an 'executable jar'. We recommend that you avoid it when running from an 'executable jar' if at all possible.
为了帮助定制,将其他一些属性从Spring Environment转移到System属性,如下表所述
Spring Environment | System Property | Comments |
---|---|---|
logging.exception-conversion-word | LOG_EXCEPTION_CONVERSION_WORD | The conversion word used when logging exceptions. |
logging.file.clean-history-on-start | LOG_FILE_CLEAN_HISTORY_ON_START | Whether to clean the archive log files on startup (if LOG_FILE enabled). (Only supported with the default Logback setup.) |
logging.file.name | LOG_FILE | If defined, it is used in the default log configuration. |
logging.file.max-size | LOG_FILE_MAX_SIZE | Maximum log file size (if LOG_FILE enabled). (Only supported with the default Logback setup.) |
logging.file.max-history | LOG_FILE_MAX_HISTORY | Maximum number of archive log files to keep (if LOG_FILE enabled). (Only supported with the default Logback setup.) |
logging.file.path | LOG_PATH | If defined, it is used in the default log configuration. |
logging.file.total-size-cap | LOG_FILE_TOTAL_SIZE_CAP | Total size of log backups to be kept (if LOG_FILE enabled). (Only supported with the default Logback setup.) |
logging.pattern.console | CONSOLE_LOG_PATTERN | The log pattern to use on the console (stdout). (Only supported with the default Logback setup.) |
logging.pattern.dateformat | LOG_DATEFORMAT_PATTERN | Appender pattern for log date format. (Only supported with the default Logback setup.) |
logging.pattern.file | FILE_LOG_PATTERN | The log pattern to use in a file (if LOG_FILE is enabled). (Only supported with the default Logback setup.) |
logging.pattern.level | LOG_LEVEL_PATTERN | The format to use when rendering the log level (default %5p). (Only supported with the default Logback setup.) |
logging.pattern.rolling-file-name | ROLLING_FILE_NAME_PATTERN | Pattern for rolled-over log file names (default ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz). (Only supported with the default Logback setup.) |
PID | PID | The current process ID (discovered if possible and when not already defined as an OS environment variable). |
所有受支持的日志记录系统在解析其配置文件时都可以查阅系统属性。 有关示例,请参见spring-boot.jar中的默认配置:
如果要在日志记录属性中使用占位符,则应使用Spring Boot的语法而不是基础框架的语法。 值得注意的是,如果使用Logback,则应使用:作为属性名称与其默认值之间的分隔符,而不应使用:-。
You can add MDC and other ad-hoc content to log lines by overriding only the LOG_LEVEL_PATTERN (or logging.pattern.level with Logback). For example, if you use logging.pattern.level=user:%X{user} %5p, then the default log format contains an MDC entry for "user", if it exists, as shown in the following example.
2019-08-30 12:30:04.031 user:someone INFO 22174 --- [ nio-8080-exec-0] demo.Controller Handling authenticated request
4.7 Logback Extensions
SpringBoot 提供了许多扩展帮助你进行高级的配置。你可以使用这些配置在你的 logback-spring.xml 配置文件中。
因为 logback.xml 配置文件加载太早,你无法通过它进行扩展。你需要使用 logback-spring.xml 或者 logging.config 配置属性进行扩展。
这些扩展不能与Logback的配置扫描(configuration scanning)一起使用。 如果尝试这样做,则对配置文件进行更改将导致类似于以下记录之一的错误:
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.7.1 Profile-specific Configuration
The <springProfile> tag lets you optionally include or exclude sections of configuration based on the active Spring profiles. Profile sections are supported anywhere within the <configuration> element. Use the name attribute to specify which profile accepts the configuration. The <springProfile> tag can contain a simple profile name (for example staging) or a profile expression. A profile expression allows for more complicated profile logic to be expressed, for example production & (eu-central | eu-west). Check the reference guide for more details. The following listing shows three sample profiles:
<springProfile>标签使您可以根据活动的 Spring profiles 文件有选择地包括或排除配置部分。在<configuration>元素内的任何位置都支持概要文件部分。使用name属性指定哪个配置文件接受配置。< springProfile >标签可以包含一个简单的 profile name (例如分段)或一个配置 profile expression。通过 profile expression 可以进行更复杂的配置。比如: production & (eu-central | eu-west),可以参考详细说明文档 reference guide
<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.7.2. Environment Properties
<springProperty>标记使您可以从Spring Environment中公开属性以在Logback中使用,如果要访问Logback配置中的application.properties文件中的值,则这样做很有用。该标签的工作方式类似于Logback的标准<property>标签。但是,不是指定一个直接的值,而是指定属性的来源(来自环境)。如果需要将属性存储在本地范围以外的其他位置,则可以使用scope属性。如果需要默认值(如果未在环境中设置该属性),则可以使用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>
属性的源必须要使用小写,否则属性无法通过 relaxed rules 添加到 环境变量(Environment)