SpringBoot | 第二十三章:日誌管理之整合篇

前言

在本系列《第四章:日誌管理》中,因爲工做中日誌這塊都是走默認配置,也沒有深刻了解過,由於部署過程當中直接使用了linux中的輸出重定向功能,如java -jar xx.jar > app.log 2>&1 &,直接輸出到某個日誌文件了。因此也就沒有認真關心過默認的日誌格式了。系列文章出來後,也看見有網友反饋說如何進行日誌的相關配置,或者配置失效問題。本着負責的原則,本文就來詳細介紹下SpringBoot中日誌管理相關配置問題。也是最近熟悉了下,有不足之處,還望指出!html

一點知識

細說各日誌框架整合配置前,咱們先來大體瞭解下,最多見的日誌的幾個級別:ERROR, WARN, INFO, DEBUGTRACE。像其餘的,好比ALLOFFFATAL之類的開發過程當中應該基本上是不會涉及的。因此如下從低到高一次介紹下常見的日誌級別。java

  • TRACE:追蹤。通常上對核心系統進行性能調試或者跟蹤問題時有用,此級別很低,通常上是不開啓的,開啓後日志會很快就打滿磁盤的。
  • DEBUG:調試。這個你們應該不陌生了。開發過程當中主要是打印記錄一些運行信息之類的。
  • INFO:信息。這個是最多見的了,大部分默認就是這個級別的日誌。通常上記錄了一些交互信息,一些請求參數等等。可方便定位問題,或者還原現場環境的時候使用。此日誌相對來講是比較重要的。
  • WARN:警告。這個通常上是記錄潛在的可能會引起錯誤的信息。好比啓動時,某某配置文件不存在或者某個參數未設置之類的。
  • ERROR:錯誤。這個也是比較常見的,通常上是在捕獲異常時輸出,雖然發生了錯誤,但不影響系統的正常運行。但可能會致使系統出錯或是宕機等。

若是將日誌設置在某個等級,則比此級別高的都能打印出來。好比,設置了INFO,那麼ERROR, WARN等都能輸出打印了,而DEBUGTRACE等就被忽略了。linux

而爲了能很好的對各日誌框架的支持,開發過程當中,通常上都是使用Commons Logging或者SL4J這些門面日誌工具。其底層封裝了統一日誌的操做,屏蔽了不一樣日誌組件之間的差別。使得咱們使用或者切換某個日誌框架時,只須要引入相關的依賴包就可替換完畢,而無需去修改源碼。其最後日誌的實際操做仍是由像log4j2logback這些日誌框架去實現的。git

從前面章節,咱們知道。SpringBoot中,內部日誌也是使用Commons Logging,同時默認配置也提供了對經常使用日誌的支持,如:Java Util LoggingLog4J, Log4J2Logback。每種Logger均可以經過配置使用控制檯或者文件輸出日誌內容。github

關於日誌的自定義配置等相關知識點,這裏就不闡述了,可直接移步《Spring Boot | 第四章:日誌管理》瞭解。本章節主要就探討下經常使用的log4j2logback相關配置。web

整合log4j2

log4j2log4j的升級版本,號稱比初版具備更高的性能,固然如今也慢慢被logback替代了。spring

配置依賴

0.移除SpringBoot默認的logback依賴包。因爲咱們直接引入了spring-boot-starter-web,因此直接排除了相應包。apache

題外話:真正引入spring-boot-starter-logging包的是spring-boot-starter依賴,因此咱們也能夠直接在spring-boot-starter下排除便可。json

<!-- 排除logging -->
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

或者springboot

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
  1. 加入log4j2依賴。
<!-- 引入log4j2 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

配置文件

按官網的說明,默認是支持XML, JSON, YAMLproperties格式。

xml文件形式

按SpringBoot官網的說明,咱們命名一個log4j2-spring.xml文件做爲默認的日誌配置文件。

自定義日誌配置

log4j2-spring.xml(本配置改造自:聊一聊log4j2配置文件log4j2.xml):

<?xml version="1.0" encoding="UTF-8"?>
 <!--日誌級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
 <!--Configuration後面的status,這個用於設置log4j2自身內部的信息輸出,能夠不設置,當設置成trace時,你會看到log4j2內部各類詳細輸出-->
 <!--monitorInterval:Log4j可以自動檢測修改配置 文件和從新配置自己,設置間隔秒數-->
 <configuration status="WARN" monitorInterval="30">
     <!--先定義全部的appender-->
     <appenders>
     <!--這個輸出控制檯的配置-->
         <console name="Console" target="SYSTEM_OUT">
         <!--輸出日誌的格式-->
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
         </console>
     <!--文件會打印出全部信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用-->
     <File name="log" fileName="log/test.log" append="false" >
        <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
     </File>
     <!-- 這個會打印出全部的info及如下級別的信息,每次大小超過size,則這size大小的日誌會自動存入按年份-月份創建的文件夾下面並進行壓縮,做爲存檔-->
         <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
             <!--控制檯只輸出level及以上級別的信息(onMatch),其餘的直接拒絕(onMismatch)-->        
             <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         </RollingFile>
         <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
             <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         <!-- DefaultRolloverStrategy屬性如不設置,則默認爲最多同一文件夾下7個文件,這裏設置了20 -->
             <DefaultRolloverStrategy max="20"/>
         </RollingFile>
         <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
             <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         </RollingFile>
     </appenders>
     <!--而後定義logger,只有定義了logger並引入的appender,appender纔會生效-->
     <loggers>
         <!--過濾掉spring和mybatis的一些無用的DEBUG信息-->
         <logger name="org.springframework" level="INFO"></logger>
         <logger name="org.mybatis" level="INFO"></logger>
         <!-- 自定義包下設置爲INFO,則能夠看見輸出的日誌不包含debug輸出了 -->
         <logger name="cn.lqdev.learning" level="INFO"/>
         <root level="all">
             <appender-ref ref="Console"/>
             <appender-ref ref="RollingFileInfo"/>
             <appender-ref ref="RollingFileWarn"/>
             <appender-ref ref="RollingFileError"/>
         </root>
     </loggers>
 </configuration>

我以爲這個配置步驟就是:先配置appenders,按需求進行個性化配置,如按天記錄等等,而後可使用logger個性化配置一些包的level日誌等級,最後配置下rootappender

properties文件形式

從官網文檔獲悉,從2.4版本後才提供了經過配置文件的支持,這使用時要注意。詳細使用語法可查看官網:Configuration with Properties,這裏以官網的例子簡單說明下:

# log4j2內部自身的日誌級別
status = error
# 配置日誌信息輸出到哪裏:err表示做爲標準錯誤輸出,還能夠是一個文件路徑或者一個URL
dest = err
# 配置名稱
name = PropertiesConfig

# 自定義屬性名稱,以便在以後的配置中使用,如${filename} 
property.filename = target/rolling/rollingtest.log
 
# 級別過濾(過濾日誌記錄) 
filter.threshold.type = ThresholdFilter
# 只記錄debug級別以上的日誌,大小寫均可以
filter.threshold.level = debug

# 控制檯類型的日誌輸出源 
appender.console.type = Console
# 名稱 :惟一
appender.console.name = STDOUT
# 佈局類型
appender.console.layout.type = PatternLayout
# 輸出模板格式 這是springboot
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID:-} [%15.15t] %C{1.} [%t]: %m%n
# 過濾級別 ThresholdFilter:低於級別的不輸出
appender.console.filter.threshold.type = ThresholdFilter
# 記錄日誌的級別
appender.console.filter.threshold.level = info
 
 # 滾動文件,會根據配置如文件大小或者時間自動生成一個新文件
appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
# 日誌文件名稱
appender.rolling.fileName = ${filename}
# 日誌回滾的文件命名規則
appender.rolling.filePattern = target/rolling2/test1-%d{MM-dd-yyyy}-%i.log.gz
appender.rolling.layout.type = PatternLayout
# 輸出格式
appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n
# 滾動日誌的策略,即設置什麼時候新建日誌文件輸出日誌
appender.rolling.policies.type = Policies
# 設置時間 
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
# 指定多久滾動一次 單位跟着filePattern配置精度最後一位 ,這裏就是2秒了
appender.rolling.policies.time.interval = 2
appender.rolling.policies.time.modulate = true
# 日誌文件的大小 
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
# 爲了測試設置小一點
appender.rolling.policies.size.size=1kb

##  還有其餘的觸發條件如:CronTriggeringPolicy 按Cron表達式進行的 具體使用可自行搜索

# 指定同一個文件夾下最多有幾個日誌文件時開始刪除最舊的,建立新的
appender.rolling.strategy.type = DefaultRolloverStrategy
# 最多5個文件,其實仍是看filePattern的i的值,當大於5後,就會自動覆蓋了
appender.rolling.strategy.max = 5
 
rootLogger.level = info
rootLogger.appenderRef.stdout.ref = STDOUT

此處須要額外設置配置文件屬性值(logging.config),本地測試時,就目錄rolling會生成文件,但裏面是空的。加上後就正常了:

logging.config=classpath:log4j2.properties

題外話:設置完,對properties配置規則仍是不太瞭解。。感受怎麼配好像均可以輸出,還望有網友能分享下具體的配置規則。對比完,仍是以爲xml格式比較直觀也容易理解。

其餘格式

按官網說明,還能夠以jsonyml格式進行配合,但須要加入相應依賴。

格式 依賴包 文件名
YAML com.fasterxml.jackson.core:jackson-databindcom.fasterxml.jackson.dataformat:jackson-dataformat-yaml log4j2.yamllog4j2.yml
JSON com.fasterxml.jackson.core:jackson-databind log4j2.jsonlog4j2.jsn

按須要添加相應依賴包便可。這裏就不細說了。

格式化符號說明

對於格式化輸出時,會看見有不一樣的格式化符號,起初看了也是一頭霧水,下面搜索相關資料後進行簡單整理概括下。

題外話:SpringBoot默認的log4j2配置文件在:spring-boot-1.5.15.RELEASE.jar/org/springframework/boot/logging/log4j2/log4j2.xml

具體官網有說明:http://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout

######### 常見參數 #########
//
%c{參數} 或 %logger{參數}  ##輸出日誌名稱
%C{參數} 或 %class{參數    ##輸出類型
%d{參數}{時區te{參數}{時區} ##輸出時間,如:%d{yyyy-MM-dd HH:mm:ss, SSS}
%F|%file                  ##輸出文件名
highlight{pattern}{style} ##高亮顯示
%l  ##輸出錯誤的完整位置
%L  ##輸出錯誤行號
%m 或 %msg 或 %message ##輸出錯誤信息
%M 或 %method ##輸出方法名
%n            ##輸出換行符
%level{參數1}{參數2}{參數3} ##輸出日誌的級別
%t 或 %thread              ##建立logging事件的線程名
*/

######### 特殊符號 ############
#有些特殊符號不能直接打印,須要使用實體名稱或者編號
//
& —— &amp; 或者 &#38;
< —— &lt;  或者 &#60;
> —— &gt;  或者 &#62;
「 —— &quot; 或者 &#34;
‘ —— &apos; 或者 &#39;
*/

######## pattern對齊修飾 ##########

// 對齊修飾,能夠指定信息的輸出格式,如是否左對齊,是否留空格等。
## 編寫格式爲在任何pattern和%之間加入一個小數,能夠是正數,也能夠是負數。
## 整數表示右對齊,負數表示左對齊;
## 整數位表示輸出信息的最小n個字符,若是輸出信息不夠n個字符,將用空格補齊;
## 小數位表示輸出信息的最大字符數,若是超過n個字符,則只保留最後n個字符的信息
## (注意:保留的是後20個字符,而不是前20個字符)
*/

#示例以下
//

%20 —— 右對齊,不足20個字符則在信息前面用空格補足,超過20個字符則保留原信息
%-20 —— 左對齊,不足20個字符則在信息後面用空格補足,超過20個字符則保留原信息
%.30 —— 若是信息超過30個字符,則只保留最後30個字符
%20.30 —— 右對齊,不足20個字符則在信息前面用空格補足,超過30個字符則只保留最後30個字符
%-20.30 —— 左對齊,不足20個字符則在信息後面用空格補足,超過30個字符則只保留最後30個字符

多環境配置

可直接經過多環境配置文件,設置logging.config的值,如 application-test.properties

logging.config=classpath:log4j2-test-spring.xml

application-prod.properties

logging.config=classpath:log4j2-prod-spring.xml

整合logback

logback是由log4j創始人設計的又一個開源日誌組件。同時也是SpringBoot默認記錄日誌的框架。

xml形式

因爲默認就是使用logback,因此只須要配置一個logback-spring.xml文件在resources目錄便可,會自動識別的。

logback-spring.xml(修改自:logback.xml詳解):

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定義日誌文件的存儲地址 勿在 LogBack 的配置中使用相對路徑 -->
    <property name="LOG_HOME" value="/home" />
    <!-- 控制檯輸出 -->
    <appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
        <encoder
            class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日誌消息,%n是換行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 按照天天生成日誌文件 -->
    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日誌文件輸出的文件名 -->
            <FileNamePattern>${LOG_HOME}/TestoKong.log.%d{yyyy-MM-dd}.log
            </FileNamePattern>
            <!--日誌文件保留天數 -->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder
            class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日誌消息,%n是換行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日誌文件最大的大小 -->
        <triggeringPolicy
            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!-- 自定義包下設置爲INFO,則能夠看見輸出的日誌不包含debug輸出了 -->
    <logger name="cn.lqdev.learning" level="INFO" />
    
    <!-- 日誌輸出級別 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

多環境配置:springProfile

使用擴展屬性 springProfilespringPropertylogback-spring.xml 配置實現多環境配置的效果。

<!-- 生產環境生效 -->
    <springProfile name="prod">
        <root level="error">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="FILE" />
        </root>
    </springProfile>


    <!-- 測試和開發環境日誌級別爲INFO/而且記錄日誌文件 -->
    <springProfile name="dev,test">
        <!-- 日誌輸出級別 -->
        <root level="INFO">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="FILE" />
        </root>
    </springProfile>

springProfile還支持讀取Spring Environment的屬性值

<!-- 讀取 spring.application.name 屬性來生成日誌文件名
    scope:做用域
    name:在 logback-spring.xml 使用的鍵
    source:application.properties 文件中的鍵
    defaultValue:默認值
 -->
<springProperty scope="context" name="logName" source="spring.application.name" defaultValue="myapp.log"/>

以後就能夠直接使用${logName}獲取到變量值了。

logback格式化符號說明

log4j2相似,具體可去官網查看:PatternLayout

  • %m:輸出代碼中指定的消息
  • %p:輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
  • %r:輸出自應用啓動到輸出該log信息耗費的毫秒數
  • %c:輸出所屬的類目,一般就是所在類的全名
  • %t:輸出產生該日誌事件的線程名
  • %n:輸出一個回車換行符,Windows平臺爲「\r\n」,Unix平臺爲「\n」
  • %d:輸出日誌時間點的日期或時間,默認格式爲ISO8601,也能夠在其後指定格式,好比:%d{yyy MMM dd HH:mm:ss,SSS},輸出相似:2002年10月18日 22:10:28,921
  • %l:輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlogback.main(TestLogback.java:10)

題外話:SpringBoot默認的logback配置文件在:spring-boot-1.5.15.RELEASE.jar/org/springframework/boot/logging/logback/defaults.xml

參考資料

關於詳細屬性配置,你們能夠自行搜索下。如下是編寫此文時,參考的一些網站信息。

  1. https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/#boot-features-logging

  2. http://logging.apache.org/log4j/2.x/manual/configuration.html

  3. https://www.cnblogs.com/wang1024/p/7786916.html

  4. http://blog.51cto.com/11931236/2058708

  5. http://www.javashuo.com/article/p-csfqcbgt-hr.html

  6. https://logback.qos.ch/manual/

總結

本文主要是簡單介紹了日誌相關知識點,同時對於經常使用的log4j2logback相關配置進行了簡單介紹。對於詳細的配置信息,可去官網查閱下。另外,對於日誌而言,不是越多越好,畢竟日誌輸出是會有性能損壞的。我的是建議,記錄該記錄的,保留事故現場的及一些錯誤都是須要進行日誌記錄的。而像一些無心義的輸出,自己就是多餘的。最後,**不要隨意打日誌!打印日誌時也注意不能用字符串拼接,須要使用佔位符或者先判斷日誌級別!不要讓日誌拖慢了你的系統!**下一章節,主要會介紹下利用AOP實現統一的訪問日誌管理。

最後

目前互聯網上不少大佬都有SpringBoot系列教程,若有雷同,請多多包涵了。本文是做者在電腦前一字一句敲的,每一步都是本身實踐和理解的。若文中有所錯誤之處,還望提出,謝謝。

老生常談

  • 我的QQ:499452441
  • 微信公衆號:lqdevOps

公衆號

我的博客:http://blog.lqdev.cn

完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-23

原文地址:http://blog.lqdev.cn/2018/08/22/springboot/chapter-twenty-three/

相關文章
相關標籤/搜索