在本系列《第四章:日誌管理》中,因爲工做中日誌這塊都是走默認配置,也沒有深刻了解過,由於部署過程當中直接使用了
linux
中的輸出重定向
功能,如java -jar xx.jar > app.log 2>&1 &
,直接輸出到某個日誌文件了。因此也就沒有認真關心過默認的日誌格式了。系列文章出來後,也看見有網友反饋說如何進行日誌的相關配置,或者配置失效問題。本着負責的原則,本文就來詳細介紹下SpringBoot
中日誌管理相關配置問題。也是最近熟悉了下,有不足之處,還望指出!html
細說各日誌框架整合配置前,咱們先來大體瞭解下,最多見的日誌的幾個級別:ERROR
, WARN
, INFO
, DEBUG
和TRACE
。像其餘的,好比ALL
、OFF
和FATAL
之類的開發過程當中應該基本上是不會涉及的。因此如下從低到高一次介紹下常見的日誌級別。java
若是將日誌設置在某個等級,則比此級別高的都能打印出來。好比,設置了INFO
,那麼ERROR
, WARN
等都能輸出打印了,而DEBUG
、TRACE
等就被忽略了。linux
而爲了能很好的對各日誌框架的支持,開發過程當中,通常上都是使用Commons Logging
或者SL4J
這些門面
日誌工具。其底層封裝了統一日誌的操做,屏蔽了不一樣日誌組件之間的差別。使得咱們使用或者切換某個日誌框架時,只須要引入相關的依賴包就可替換完畢,而無需去修改源碼。其最後日誌的實際操做仍是由像log4j2
、logback
這些日誌框架去實現的。git
從前面章節,咱們知道。SpringBoot
中,內部日誌也是使用Commons Logging
,同時默認配置也提供了對經常使用日誌的支持,如:Java Util Logging
,Log4J
, Log4J2
和Logback
。每種Logger
均可以經過配置使用控制檯或者文件輸出日誌內容。github
關於日誌的自定義配置等相關知識點,這裏就不闡述了,可直接移步《Spring Boot | 第四章:日誌管理》瞭解。本章節主要就探討下經常使用的log4j2
及logback
相關配置。web
log4j2
是log4j
的升級版本,號稱比初版具備更高的性能,固然如今也慢慢被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>
log4j2
依賴。<!-- 引入log4j2 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
按官網的說明,默認是支持
XML
,JSON
,YAML
和properties
格式。
按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
日誌等級,最後配置下root
的appender
。
從官網文檔獲悉,從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
格式比較直觀也容易理解。
按官網說明,還能夠以
json
和yml
格式進行配合,但須要加入相應依賴。
格式 | 依賴包 | 文件名 |
---|---|---|
YAML | com.fasterxml.jackson.core:jackson-databind 、com.fasterxml.jackson.dataformat:jackson-dataformat-yaml |
log4j2.yaml 、log4j2.yml |
JSON | com.fasterxml.jackson.core:jackson-databind |
log4j2.json 、log4j2.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事件的線程名 */ ######### 特殊符號 ############ #有些特殊符號不能直接打印,須要使用實體名稱或者編號 // & —— & 或者 & < —— < 或者 < > —— > 或者 > 「 —— " 或者 " ‘ —— ' 或者 ' */ ######## 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
是由log4j創始人設計的又一個開源日誌組件。同時也是SpringBoot
默認記錄日誌的框架。
因爲默認就是使用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
與 springProperty
讓 logback-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}
獲取到變量值了。
和
log4j2
相似,具體可去官網查看:PatternLayout。
題外話:SpringBoot
默認的logback配置文件在:spring-boot-1.5.15.RELEASE.jar/org/springframework/boot/logging/logback/defaults.xml
。
關於詳細屬性配置,你們能夠自行搜索下。如下是編寫此文時,參考的一些網站信息。
https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/#boot-features-logging
http://logging.apache.org/log4j/2.x/manual/configuration.html
本文主要是簡單介紹了日誌相關知識點,同時對於經常使用的
log4j2
和logback
相關配置進行了簡單介紹。對於詳細的配置信息,可去官網查閱下。另外,對於日誌而言,不是越多越好,畢竟日誌輸出是會有性能損壞的。我的是建議,記錄該記錄的,保留事故現場的及一些錯誤都是須要進行日誌記錄的。而像一些無心義的輸出,自己就是多餘的。最後,**不要隨意打日誌!打印日誌時也注意不能用字符串拼接,須要使用佔位符或者先判斷日誌級別!不要讓日誌拖慢了你的系統!**下一章節,主要會介紹下利用AOP
實現統一的訪問日誌管理。
目前互聯網上不少大佬都有
SpringBoot
系列教程,若有雷同,請多多包涵了。本文是做者在電腦前一字一句敲的,每一步都是本身實踐和理解的。若文中有所錯誤之處,還望提出,謝謝。
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/