Spring Boot 日志記錄(log)

Spring Boot 使用 Commons Logging 記錄所有內(nèi)部日志,但開放日志的底層實(shí)現(xiàn)。其為 Java Util Logging
、Log4J2Logback 提供了默認(rèn)配置。在每種情況下,日志記錄器都預(yù)先配置為使用控制臺(tái)輸出,并且還提供可選的文件輸出。

默認(rèn)情況下,如果您使用了 Starter,則使用 Logback 進(jìn)行日志記錄。還包括合適的 Logback 路由,以確保在使用 Java Util Logging、Commons Logging、Log4J 或 SLF4J 的依賴庫都能正常工作。

提示

Java 有很多日志框架可供使用。如果以上列表讓您感到困惑,請(qǐng)不要擔(dān)心。通常,您不需要更改日志依賴,并且 Spring Boot 提供的默認(rèn)配置可以保證日志正常工作。

日志格式

Spring Boot 默認(rèn)日志輸出類似于以下示例:

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: [/*]

輸出以下項(xiàng):

  • 日期和時(shí)間:毫秒精度,易于排序。
  • 日志級(jí)別:ERROR、WARN、INFO、DEBUGTRACE。
  • 進(jìn)程 ID。
  • 一個(gè) --- 分隔符,用于區(qū)分實(shí)際日志內(nèi)容的開始。
  • 線程名稱:在方括號(hào)中(可能會(huì)截?cái)嗫刂婆_(tái)輸出)。
  • 日志記錄器名稱:這通常是源類名稱(通常為縮寫)。
  • 日志內(nèi)容。

注意

Logback 沒有 FATAL 級(jí)別。該級(jí)別映射到 ERROR。

控制臺(tái)輸出

默認(rèn)日志配置會(huì)在寫入時(shí)將消息回顯到控制臺(tái)。默認(rèn)情況下,會(huì)記錄 ERROR、WARNINFO 級(jí)別的日志。您還可以通過使用 --debug 標(biāo)志啟動(dòng)應(yīng)用程序來啟用調(diào)試模式。

$ java -jar myapp.jar --debug

注意

您還可以在 application.properties 中指定 debug=true。

啟用調(diào)試模式后,核心日志記錄器(內(nèi)嵌容器、Hibernate 和 Spring Boot)將被配置為輸出更多日志信息。啟用調(diào)試模式不會(huì)將應(yīng)用程序配置為使用 DEBUG 級(jí)別記錄所有日志內(nèi)容。

或者,您可以通過使用 --trace 標(biāo)志(或在 application.properties 中的設(shè)置 trace=true)啟動(dòng)應(yīng)用程序來啟用跟蹤模式。這樣做可以為選擇的核心日志記錄器(內(nèi)嵌容器、Hibernate 模式生成和整個(gè) Spring 組合)啟用日志追蹤。

著色輸出

如果您的終端支持 ANSI,則可以使用顏色輸出來提高可讀性。您可以將 spring.output.ansi.enabled 設(shè)置為受支持的值以覆蓋自動(dòng)檢測(cè)。

可使用 %clr 轉(zhuǎn)換字配置顏色編碼。最簡(jiǎn)單形式是,轉(zhuǎn)換器根據(jù)日志級(jí)別對(duì)輸出進(jìn)行著色,如下所示:

%clr(%5p)

下表描述日志級(jí)別與顏色的映射關(guān)系:

級(jí)別 顏色
FATAL 紅(Red)
ERROR 紅(Red)
WARN 黃(Yellow)
INFO 綠(Green)
DEBUG 綠(Green)
TRACE 綠(Green)

或者,您可以通過將其作為轉(zhuǎn)換選項(xiàng)指定應(yīng)使用的顏色或樣式。例如,要將文本變?yōu)辄S色,請(qǐng)使用以下設(shè)置:

%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}

支持以下顏色和樣式:

  • blue
  • cyan
  • faint
  • green
  • magenta
  • red
  • yellow

文件輸出

默認(rèn)情況下,Spring Boot 僅記錄到控制臺(tái),不會(huì)寫入日志文件。想除了控制臺(tái)輸出之外還要寫入日志文件,則需要設(shè)置 logging.filelogging.path 屬性(例如,在 application.properties 中)。

下表展示了如何與 logging.* 屬性一起使用:

表 26.1、Logging 屬性

logging.file logging.path 示例 描述
(無) (無) 僅在控制臺(tái)輸出
指定文件 (無) my.log 寫入指定的日志文件。名稱可以是絕對(duì)位置或相對(duì)于當(dāng)前目錄。
(無) 指定目錄 /var/log spring.log 寫入指定的目錄。名稱可以是絕對(duì)位置或相對(duì)于當(dāng)前目錄。

日志文件在達(dá)到 10MB 時(shí)會(huì)輪轉(zhuǎn),并且與控制臺(tái)輸出一樣,默認(rèn)情況下會(huì)記錄 ERRORWARNINFO 級(jí)別的內(nèi)容。可以使用 logging.file.max-size 屬性更改大小限制。除非已設(shè)置 logging.file.max-history 屬性,否則以前輪轉(zhuǎn)的文件將無限期歸檔。

注意

日志記錄系統(tǒng)在應(yīng)用程序生命周期的早期開始初始化。因此,通過 @PropertySource 注解加載的屬性文件中是找不到日志屬性的。

提示

日志屬性獨(dú)立于實(shí)際的日志底層。因此,spring Boot 不管理特定的配置 key(例如 Logback 的 logback.configurationFile)。

日志等級(jí)

所有受支持的日志記錄系統(tǒng)都可以使用 logging.level.<logger-name>=<level> 來設(shè)置 Spring Environment 中的記錄器等級(jí)(例如,在 application.properties 中)。其中 level 是 TRACE、DEBUG、INFO、WARN、ERROR、FATAL 和 OFF 其中之一??梢允褂?logging.level.root 配置 root 記錄器。

以下示例展示了 application.properties 中默認(rèn)的日志記錄設(shè)置:

logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR

日志組

將相關(guān)記錄器組合在一起以便可以同時(shí)配置,這通常很有用。例如,您可以更改所有 Tomcat 相關(guān)記錄器的日志記錄級(jí)別,但您無法輕松記住頂層的包名。

為了解決這個(gè)問題,Spring Boot 允許您在 Spring Environment 中定義日志記錄組。例如,以下通過將 tomcat 組添加到 application.properties 來定義 tomcat 組:

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

定義后,您可以使用一行配置來更改組中所有記錄器的級(jí)別:

logging.level.tomcat=TRACE

Spring Boot 包含以下預(yù)定義的日志記錄組,可以直接使用:

名稱 日志記錄器
web org.springframework.core.codec、org.springframework.http、org.springframework.web
sql org.springframework.jdbc.coreorg.hibernate.SQL

自定義日志配置

可以通過在 classpath 中引入適合的庫來激活各種日志記錄系統(tǒng),并且可以通過在 classpath 的根目錄中或在以下 Spring Environment 屬性指定的位置提供合適的配置文件來進(jìn)一步自定義:logging.config。

您可以使用 org.springframework.boot.logging.LoggingSystem 系統(tǒng)屬性強(qiáng)制 Spring Boot 使用特定的日志記錄系統(tǒng)。該值應(yīng)該是一個(gè)實(shí)現(xiàn)了 LoggingSystem 的類的完全限定類名。您還可以使用 none 值完全禁用 Spring Boot 的日志記錄配置。

注意

由于日志記錄在創(chuàng)建 ApplicationContext 之前初始化,因此無法在 Spring @Configuration 文件中控制來自 @PropertySources 的日志記錄。更改日志記錄系統(tǒng)或完全禁用它的唯一方法是通過系統(tǒng)屬性設(shè)置。

根據(jù)您的日志記錄系統(tǒng),將加載以下文件:

日志記錄系統(tǒng) 文件
Logback logback-spring.xml、logback-spring.groovy、logback.xml 或者 logback.groovy
Log4j2 log4j2-spring.xml 或者 log4j2.xml
JDK(Java Util Logging) logging.properties

注意

如果可能,我們建議您使用 -spring 的形式來配置日志記錄(比如 logback-spring.xml 而不是 logback.xml)。如果使用標(biāo)準(zhǔn)的配置位置,Spring 無法完全控制日志初始化。

警告

Java Util Logging 存在已知的類加載問題,這些問題在以可執(zhí)行 jar 運(yùn)行時(shí)會(huì)觸發(fā)。如果可能的話,我們建議您在使用可執(zhí)行 jar 方式運(yùn)行時(shí)避免使用它。

為了進(jìn)行自定義,部分其他屬性會(huì)從 Spring Environment 傳輸?shù)?System 屬性,如下表所述:

Spring Environment 系統(tǒng)屬性 說明
logging.exception-conversion-word LOG_EXCEPTION_CONVERSION_WORD 記錄異常時(shí)使用的轉(zhuǎn)換字。
logging.file LOG_FILE 如果已定義,則在默認(rèn)日志配置中使用它。
logging.file.max-size LOG_FILE_MAX_SIZE 最大日志文件大?。ㄈ绻麊⒂昧?LOG_FILE)。(僅支持默認(rèn)的 Logback 設(shè)置。)
logging.file.max-history LOG_FILE_MAX_HISTORY 要保留的歸檔日志文件最大數(shù)量(如果啟用了 LOG_FILE)。(僅支持默認(rèn)的 Logback 設(shè)置。)
logging.path LOG_PATH 如果已定義,則在默認(rèn)日志配置中使用它。
logging.pattern.console CONSOLE_LOG_PATTERN 要在控制臺(tái)上使用的日志模式(stdout)。(僅支持默認(rèn)的 Logback 設(shè)置。)
logging.pattern.dateformat LOG_DATEFORMAT_PATTERN 日志日期格式的 Appender 模式。(僅支持默認(rèn)的 Logback 設(shè)置。)
logging.pattern.file FILE_LOG_PATTERN 要在文件中使用的日志模式(如果啟用了 LOG_FILE)。(僅支持默認(rèn)的 Logback 設(shè)置。)
logging.pattern.level LOG_LEVEL_PATTERN 渲染日志級(jí)別時(shí)使用的格式(默認(rèn)值為 %5p)。(僅支持默認(rèn)的 Logback 設(shè)置。)
PID PID 當(dāng)前進(jìn)程 ID(如果可能,則在未定義為 OS 環(huán)境變量時(shí)發(fā)現(xiàn))。

所有受支持的日志記錄系統(tǒng)在解析其配置文件時(shí)都可以參考系統(tǒng)屬性。有關(guān)示例,請(qǐng)參閱 spring-boot.jar 中的默認(rèn)配置:

提示

如果要在日志記錄屬性中使用占位符,則應(yīng)使用 Spring Boot 的語法,而不是使用底層框架的語法。值得注意的是,如果使用 Logback,則應(yīng)使用 : 作為屬性名稱與其默認(rèn)值之間的分隔符,而不是使用 :-。

提示

您可以通過僅覆蓋 LOG_LEVEL_PATTERN(或帶 Logback 的 logging.pattern.level)將 MDC 和其他特別的內(nèi)容添加到日志行。例如,如果使用 logging.pattern.level=user:%X{user} %5p,則默認(rèn)日志格式包含 user MDC 項(xiàng)(如果存在),如下所示:

2015-09-30 12:30:04.031 user:someone INFO 22174 --- [  nio-8080-exec-0] demo.Controller
Handling authenticated request

Logback 擴(kuò)展

Spring Boot 包含許多 Logback 擴(kuò)展,可用于進(jìn)行高級(jí)配置。您可以在 logback-spring.xml 配置文件中使用這些擴(kuò)展。

注意

由于標(biāo)準(zhǔn)的 logback.xml 配置文件加載過早,因此無法在其中使用擴(kuò)展。您需要使用 logback-spring.xml 或定義 logging.config 屬性。

警告

擴(kuò)展不能與 Logback 的配置掃描一起使用。如果嘗試這樣做,更改配置文件會(huì)導(dǎo)致發(fā)生類似以下錯(cuò)誤日志:

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]]

特定 Profile 配置

<springProfile> 標(biāo)簽允許您根據(jù)激活的 Spring profile 選擇性地包含或排除配置部分。在 <configuration> 元素中的任何位置都支持配置 profile。使用 name 屬性指定哪個(gè) proifle 接受配置。<springProfile> 標(biāo)記可以包含簡(jiǎn)單的 proifle 名稱(例如 staging)或 profile 表達(dá)式。profile 表達(dá)式允許表達(dá)更復(fù)雜的 profile 邏輯,例如 production & (eu-central | eu-west)。有關(guān)詳細(xì)信息,請(qǐng)查閱參考指南。以下清單展示了三個(gè)示例 profile:

<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>

著重強(qiáng)調(diào):在 <configuration> 元素中的任何位置都支持配置 profile。

環(huán)境屬性

使用 <springProperty> 標(biāo)記可以讓您暴露 Spring 環(huán)境(Environment)中的屬性,以便在 Logback 中使用。如果在 Logback 配置中訪問來自 application.properties 文件的值,這樣做很有用。標(biāo)簽的工作方式與 Logback 的標(biāo)準(zhǔn) <property> 標(biāo)簽類似。但是,您可以指定屬性(來自 Environment)的 source,而不是指定直接的 value。如果需要將屬性存儲(chǔ)在 local 范圍以外的其他位置,則可以使用 scope 屬性。如果需要回退值(如果未在 Environment 中設(shè)置該屬性),則可以使用 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>

注意

必須以 kebab 風(fēng)格(短橫線小寫風(fēng)格)指定 source(例如 my.property-name)。但可以使用寬松規(guī)則將屬性添加到 Environment 中。

我的筆記

將動(dòng)手改造項(xiàng)目的logback 配置。

參考 springframework-boot 自帶的 logback 配置
https://github.com/spring-projects/spring-boot/tree/2.0.x/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/logback

console-appender.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
Console appender logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->

<included>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
</included>

file-appender.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
File appender logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->

<included>
    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
            <maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
            <maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
        </rollingPolicy>
    </appender>
</included>

defaults.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
Default logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->

<included>
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
    <logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
    <logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
    <logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
    <logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
    <logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
    <logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
</included>

base.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->
<included>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</included>

  • 加色多色日志
  • 去除終端輸出(按照是否需要,可自行加上)
  • 提取公有 common module 的 logback 配置文件,方便其他模塊進(jìn)行應(yīng)用
  • 區(qū)分生產(chǎn)環(huán)境 prod 和其他。生產(chǎn)環(huán)境下使用 gz 表示存儲(chǔ)為壓縮后的日志。

由于這里幾乎是完全自定義 logback 配置文件,所以舍棄了自帶的 base.xml 配置。

  1. 在 common mudule 的 resources 下新建 xxx-logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
MY_MODULE_NAME 僅需依賴 Spring Environment 的 logging.file
-->
<included>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <property name="MY_MODULE_NAME" value="${LOG_FILE:-spring}"/>
    <property name="LOG_FILE" value="logs/${MY_MODULE_NAME}.log"/>
    <conversionRule conversionWord="ip" converterClass="com.xxx.config.LogIpConfig"/>
    <springProperty scope="context" name="MY_SERVER_PORT" source="server.port"/>
    <property name="FILE_LOG_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} %clr(%-5level) [${MY_MODULE_NAME},%ip:${MY_SERVER_PORT},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-B3-ParentSpanId:-},%thread] %clr(%-40.40logger{39}){cyan} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <springProfile name="prod">
                <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}</fileNamePattern>
                <maxHistory>${LOG_FILE_MAX_HISTORY:-10}</maxHistory>
            </springProfile>
            <springProfile name="!prod">
                <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>
                <maxHistory>${LOG_FILE_MAX_HISTORY:-25}</maxHistory>
            </springProfile>
        </rollingPolicy>
    </appender>

    <root level="INFO">
        <appender-ref ref="FILE"/>
    </root>
</included>
  1. 配置 logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="xxx-logback.xml" />
</configuration>

最終提交日志


參考

本文大部分內(nèi)容轉(zhuǎn)載自
Spring Boot 特性 - 26、日志記錄 - 《Spring Boot 中文文檔》 - 書棧網(wǎng) · BookStack
https://www.bookstack.cn/read/springboot/spilt.4.pages-spring-boot-features.md

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容