springboot使用logback自定義日志的詳細(xì)過程
前言
1、末尾有完整配置文件
2、日志分為五個等級,按照優(yōu)先級的高低可以分為:
TRANCE < DEBUG < INFO < WARN < ERROR
springboot
默認(rèn)是INFO
,因此低于INFO
的TRACE
和DEBUG
都不會輸出。
可以在properties
或yaml
配置文件中修改日志級別:
logging: level: root: debug
這里的root
可以換成包名,精細(xì)控制不同包的日志輸出級別,比如:
logging: level: com.example.controller: debug com.example.mapper: error
3、其次,logback的日志分為控制臺日志和文件日志。
控制臺日志:也就是我們IDE運(yùn)行項目時,控制臺打印的信息。
文件日志:項目運(yùn)行時,將運(yùn)行信息寫入到指定文件。需要在springboot
配置文件或logback
配置文件中指定日志文件的位置。
引入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency>
解釋:按理來講需要引入的是spring-boot-starter-logging
依賴,但是spring-boot-starter-web
間接依賴于spring-boot-starter-logging
,所以我們只需要引入spring-boot-starter-web
即可。
使用logback
logback
會自動尋找classpath
根部下面的logback.xml
,所以我們只需要在resource
目錄下創(chuàng)建logback.xml
文件,就可以在程序啟動時,自動加載自定義日志的配置文件。
如果不想叫logback.xml
,想起一個有個性的名字,比如cxkLogback.xml
,那么需要在properties
或yaml
配置文件指定logback
文件路徑:
logging: config: classpath:cxkLogback.xml
如果想驗證一下,可以將下方概覽中的配置文件復(fù)制到自己的項目中運(yùn)行一下,觀察控制臺的日志輸出格式。
配置文件概覽
可以簡單先看一個配置文件的案例
<?xml version="1.0" encoding="UTF-8"?> <!-- scan:當(dāng)配置文件修改后,將會重新載入。 scanPeriod:設(shè)置檢測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時,此屬性生效。 debug:為true時,將打印出logback內(nèi)部日志信息,實(shí)時查看logback運(yùn)行狀態(tài)。默認(rèn)值為false。 --> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 定義一個名為STDOUT的控制臺輸出Appender --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <!-- 輸出格式 --> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 定義一個名為FILE的文件輸出Appender --> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <!-- 設(shè)置日志文件的存放路徑和文件名,可根據(jù)實(shí)際情況修改 --> <file>logs/app.log</file> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 配置根日志記錄器,設(shè)置日志級別為DEBUG,并將日志輸出到STDOUT和FILE這兩個Appender --> <root level="info"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> </configuration>
這個文件主要定義了兩個Appender
,分別輸出日志到控制臺和文件中。
其次定義root
目錄的日志級別,并將兩個Appender
配置到root
目錄下,進(jìn)行日志輸出。
這里的root
標(biāo)簽里面定義了level
,有沒有感覺在哪里見過這個東西?
沒錯,上文講到,我們可以在properties
或yaml
配置文件中修改日志級別,在springboot
配置文件中的操作,和這里的操作是等價的。那么按照同樣的道理,這里的root
也可以細(xì)化成不同的包,配置不同的level
和Appender
。這里只是引出這個概念,具體的內(nèi)容放在下文。
配置項詳解
<configuration>
:logback配置的根標(biāo)簽。它包含三個屬性:scan
、scanPeriod
、debug
。
scan
:當(dāng)配置文件修改后,將會重新載入。值為true
或false
。scanPeriod
:時間間隔。每隔一段時間檢測一次配置文件是否被修改。值可以是60
或12 second
,數(shù)字是自定義的,不是非要填60
或12
,如果沒有給出時間單位,默認(rèn)單位是毫秒。當(dāng)scan
為true
時,此屬性生效。debug
:是否打印logback
內(nèi)部日志信息,實(shí)時查看logback運(yùn)行狀態(tài)。值為true
或false
(默認(rèn))。
<Appender>
:可以理解成負(fù)責(zé)寫日志的工具人。一個Appender
就是一個工具人。
<logger>
:設(shè)置某一個包或具體的類的日志打印級別,以及指定的Appender
(分配打工人)。
<root>
:根logger
,也是logger
的一種,且只有一個level
屬性。
contextName
:每個logger
都關(guān)聯(lián)到logger
上下文,默認(rèn)上下文名稱為default
。但可以使用contextName
標(biāo)簽設(shè)置成其他名字,用于區(qū)分不同應(yīng)用程序的記錄。
property
:用來定義變量值的標(biāo)簽,property
標(biāo)簽有兩個屬性,name
和value
;其中name
的值是變量的名稱,value
的值時變量定義的值。通過property
定義的值會被插入到logger
上下文中。定義變量后,可以使“${name}”
來使用變量。
Appender
的種類:
- ConsoleAppender:控制臺日志。
- FileAppender:文件日志。
- RollingFileAppender:滾動文件日志。會在日志文件達(dá)到某種條件后,創(chuàng)建新的日志文件繼續(xù)寫入日志。常見的條件是文件的大小,比如設(shè)置每個文件大小為2KB時,創(chuàng)建新的文件繼續(xù)寫入,文件名大致為xxx1.log,xxx2.log。
輸出格式詳解
舉個例子:%level | %d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai} | [%thread] | %-4relative | %logger{40}| -- %msg%n
%level
:日志級別。
%d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai}
:時間。
[%thread]
:當(dāng)前線程。
%-4relative
:從程序啟動到當(dāng)前日志記錄事件所經(jīng)過的相對時間。-
表示左對齊,4
表示4個字符寬度。
%logger{40}
:輸出日志記錄器名稱的占位符,其中40
是一個可選的參數(shù),用于指定輸出的日志記錄器名稱的最大長度。如果不指定{40}
這樣的參數(shù),默認(rèn)會輸出完整的日志記錄器名稱。
%msg
:日志消息主體。
%n
:換行。
%file
:文件名。
%line
:行號。
配置文件示例
<?xml version="1.0" encoding="UTF-8"?> <!-- scan:當(dāng)配置文件修改后,將會重新載入。 scanPeriod:設(shè)置檢測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時,此屬性生效。 debug:為true時,將打印出logback內(nèi)部日志信息,實(shí)時查看logback運(yùn)行狀態(tài)。默認(rèn)值為false。 --> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 日志文件路徑,如果spring配置文件沒有對應(yīng)值,使用默認(rèn)值 --> <springProperty scope="context" name="springFilePath" source="log.path" defaultValue="src/main/resources/log"/> <!-- 將日志輸出到控制臺 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%level | %d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai} | [%thread] | %-4relative | %logger{40}| -- %msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- 將日志輸出到文件 --> <!-- 使用輪轉(zhuǎn)日志:日志文件超出一定大小后,會新建一個文件(Rolling) --> <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 設(shè)置文件路徑 --> <file>${springFilePath}/spring.log</file> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %thread -- %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- 基于時間和大小的滾動策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 日志文件輸出的文件名 --> <fileNamePattern>${springFilePath}/spring.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 單個日志文件最大體積,超出最大值,會新建一個日志文件--> <maxFileSize>200MB</maxFileSize> <!-- 日志文件保留天數(shù) --> <maxHistory>60</maxHistory> <!-- 所有日志文件的總體積限制 --> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> </appender> <!-- root節(jié)點(diǎn)時必選節(jié)點(diǎn),用來指定最基礎(chǔ)的日志輸出級別,只有一個level屬性 --> <root level="info"> <appender-ref ref="console" /> <appender-ref ref="file" /> </root> </configuration>
給日志配置顏色
方式一、使用官方默認(rèn)配置
只需要在xml配置文件里引入配置文件即可。
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
什么?你問我這個文件去哪里找?根據(jù)resource
里面的路徑,去lib目錄的springboot依賴中找。
方式二、自定義顏色配置
使用形如%clr(){red}
來給日志標(biāo)簽配置顏色。
要使用%clr
,有兩種方式:
第一種是引入方式一的默認(rèn)配置文件,在該文件里面就幫我們引入了%clr
。
第二種方式就是手動引入%clr
,可以參考一下defaults.xml
。
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
%clr
支持的顏色:blue、cyan、faint、green、magenta、red、yellow
faint
:淡色(控制臺默認(rèn)顏色)
magenta
:品紅色
這里貼一下我的pattern
%level | %clr(%d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai}){magenta} | [%thread] | %-4relative | %clr(%logger{40}){magenta}| -- %msg%n
那這個時候你就會發(fā)現(xiàn)了,這樣自定義的話,我的level怎么沒有顏色啊。
不要擔(dān)心,有解決辦法的。
這里提供兩種解決辦法:
第一種可以更改一下logback
中,%clr
對于level的判斷,針對不同level
顯示不同顏色,但是這個我還不會,所以自行探索。
第二種要用的是%highlight
高亮。
使用%highlight給level配置顏色
第一步、新建一個高亮顏色配置類。
import ch.qos.logback.classic.Level; import ch.qos.logback.classic.pattern.color.HighlightingCompositeConverter; import ch.qos.logback.classic.spi.ILoggingEvent; import static ch.qos.logback.core.pattern.color.ANSIConstants.*; import static ch.qos.logback.core.pattern.color.ANSIConstants.DEFAULT_FG; /** * 自定義 %highlight,實(shí)現(xiàn)不同日志level不同顏色 */ public class LevelHighLightColorConfig extends HighlightingCompositeConverter { // 這里用的版本是springboot 2.6.13 // 如果你發(fā)現(xiàn)父類中的方法不是getForegroundColorCode,可能是版本差異造成的。 // 那么需要你對著父類ctrl+左鍵點(diǎn)擊,看看父類是怎么實(shí)現(xiàn)的 // 然后照貓畫虎繼續(xù)修改,核心邏輯就是判斷然后返回不同的顏色。 // 因為作者跟著AI配置的時候就遇到這種情況,也是模仿父類進(jìn)行修改的。 @Override protected String getForegroundColorCode(ILoggingEvent event) { Level level = event.getLevel(); switch (level.toInt()) { case Level.ERROR_INT: return RED_FG; case Level.WARN_INT: return YELLOW_FG; case Level.INFO_INT: return GREEN_FG; default: return DEFAULT_FG; } } }
第二步、在logback.xml
配置文件中引入我們的%highlight
conversionWord
的值固定為highlight
,converterClass
的值為我們上一步寫的配置類。
<conversionRule conversionWord="highlight" converterClass="com.yexiao.userCenter.config.LevelHighLightColorConfig" />
第三步、編寫pattern
<pattern>%highlight(%level) | %clr(%d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai}){magenta} | [%thread] | %-4relative | %clr(%logger{40}){magenta}| -- %msg%n</pattern>
完整配置文件
<?xml version="1.0" encoding="UTF-8"?> <!-- scan:當(dāng)配置文件修改后,將會重新載入。 scanPeriod:設(shè)置檢測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時,此屬性生效。 debug:為true時,將打印出logback內(nèi)部日志信息,實(shí)時查看logback運(yùn)行狀態(tài)。默認(rèn)值為false。 --> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <conversionRule conversionWord="highlight" converterClass="com.yexiao.userCenter.config.LevelHighLightColorConfig" /> <!-- 日志文件路徑,如果spring配置文件沒有對應(yīng)值,使用默認(rèn)值 --> <springProperty scope="context" name="springFilePath" source="log.path" defaultValue="src/main/resources/log"/> <!-- 將日志輸出到控制臺 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%highlight(%level) | %clr(%d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai}){magenta} | [%thread] | %-4relative | %clr(%logger{40}){magenta}| -- %msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- 將日志輸出到文件 --> <!-- 使用輪轉(zhuǎn)日志:日志文件超出一定大小后,會新建一個文件(Rolling) --> <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 設(shè)置文件路徑 --> <file>${springFilePath}/spring.log</file> <!-- 基于時間和大小的滾動策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 日志文件輸出的文件名 --> <fileNamePattern>${springFilePath}/spring.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 單個日志文件最大體積,超出最大值,會新建一個日志文件--> <maxFileSize>200MB</maxFileSize> <!-- 日志文件保留天數(shù) --> <maxHistory>60</maxHistory> <!-- 所有日志文件的總體積限制 --> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %thread -- %msg%n</pattern> <charset>utf-8</charset> </encoder> </appender> <!-- root節(jié)點(diǎn)時必選節(jié)點(diǎn),用來指定最基礎(chǔ)的日志輸出級別,只有一個level屬性 --> <root level="info"> <appender-ref ref="console" /> <appender-ref ref="file" /> </root> </configuration>1
Tips 1、文件路徑配置問題
文件路徑有兩種方式配置,分別是file
和path
,或者在xml文件中配置。
注:file和path二者不能同時使用,如若同時使用,則只有l(wèi)ogging.file生效 logging.file=文件名 logging.path=日志文件路徑 logging.level.包名=指定包下的日志級別 logging.pattern.console=日志打印規(guī)則
- logging.file,設(shè)置文件,可以是絕對路徑,也可以是相對路徑。如:
logging.file=my.log
- logging.path,設(shè)置目錄,會在該目錄下創(chuàng)建spring.log文件,并寫入日志內(nèi)容,如:
logging.path=/var/log
注:二者不能同時使用,如若同時使用,則只有l(wèi)ogging.file生效,可以看到這種方式配置簡單,但是能實(shí)現(xiàn)的功能也非常有限,如果想要更復(fù)雜的需求,就需要下面的定制化配置了。
2、使用%clr添加顏色,啟動報錯
完整報錯如下:
Exception in thread "main" java.lang.IllegalStateException: Logback configuration error detected: ERROR in ch.qos.logback.core.pattern.parser.Compiler@7a362b6b - There is no conversion class registered for composite conversion word [clr] ERROR in ch.qos.logback.core.pattern.parser.Compiler@7a362b6b - Failed to create converter for [%clr] keyword ERROR in ch.qos.logback.core.pattern.parser.Compiler@7a362b6b - There is no conversion class registered for composite conversion word [clr] ERROR in ch.qos.logback.core.pattern.parser.Compiler@7a362b6b - Failed to create converter for [%clr] keyword at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:166) at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:82) at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:60) at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:114) at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:264) at org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:237) at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:200) at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:173) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127) at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:74) at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54) at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:358) at org.springframework.boot.SpringApplication.run(SpringApplication.java:317) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243) at com.kaka.jtest.springboot.Application.main(Application.java:24)
解決辦法:
沒有引入%clr
,需要引入默認(rèn)的配置文件
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
或手動引入%clr
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
3、不要在日志文件里面使用顏色輸出
使用顏色輸出會將顏色轉(zhuǎn)換成ANSI碼,不會有顏色,可讀性較差。
參考鏈接
【1】SpringBoot+logback優(yōu)雅的配置日志
到此這篇關(guān)于springboot使用logback自定義日志的文章就介紹到這了,更多相關(guān)springboot logback自定義日志內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用自定義注解實(shí)現(xiàn)為事件源綁定事件監(jiān)聽器操作示例
這篇文章主要介紹了Java使用自定義注解實(shí)現(xiàn)為事件源綁定事件監(jiān)聽器操作,結(jié)合實(shí)例形式分析了java自定義注解、注解處理、事件監(jiān)聽與響應(yīng)等相關(guān)操作技巧,需要的朋友可以參考下2019-10-10Spring Boot環(huán)境屬性占位符解析及類型轉(zhuǎn)換詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot環(huán)境屬性占位符解析及類型轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08詳解Spring?Security?捕獲?filter?層面異常返回我們自定義的內(nèi)容
Spring?的異常會轉(zhuǎn)發(fā)到?BasicErrorController?中進(jìn)行異常寫入,然后才會返回客戶端。所以,我們可以在?BasicErrorController?對?filter異常進(jìn)行捕獲并處理,下面通過本文給大家介紹Spring?Security?捕獲?filter?層面異常,返回我們自定義的內(nèi)容,感興趣的朋友一起看看吧2022-05-05SpringBoot集成thymeleaf渲染html模板的步驟詳解
這篇文章主要給大家詳細(xì)介紹了SpringBoot集成thymeleaf如何使實(shí)現(xiàn)html模板的渲染,文中有詳細(xì)的代碼示例,具有一定的參考價值,需要的朋友可以參考下2023-06-06JAVA實(shí)現(xiàn)Excel和PDF上下標(biāo)的操作代碼
這篇文章主要介紹了JAVA實(shí)現(xiàn)Excel和PDF上下標(biāo),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09Spring MVC攔截器_動力節(jié)點(diǎn)Java學(xué)院整理
Spring MVC的攔截器,是屬于HandlerMapping級別的,可以有多個HandlerMapping ,每個HandlerMapping可以有自己的攔截器,具體內(nèi)容詳情大家通過本文學(xué)習(xí)吧2017-08-08