4. Logging

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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342