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: error3、其次,logback的日志分為控制臺日志和文件日志。
控制臺日志:也就是我們IDE運(yùn)行項(xiàng)目時,控制臺打印的信息。
文件日志:項(xiàng)目運(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
如果想驗(yàn)證一下,可以將下方概覽中的配置文件復(fù)制到自己的項(xiàng)目中運(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)容放在下文。
配置項(xiàng)詳解
<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ù)修改,核心邏輯就是判斷然后返回不同的顏色。
// 因?yàn)樽髡吒鳤I配置的時候就遇到這種情況,也是模仿父類進(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>1Tips 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)文章
springboot項(xiàng)目打包發(fā)布部署的過程及jar和war的區(qū)別
Spring Boot使用了內(nèi)嵌容器,因此它的部署方式也變得非常簡單靈活,可以將Spring Boot項(xiàng)目打包成JAR包來獨(dú)立運(yùn)行,Spring Boot項(xiàng)目既可以生成WAR包發(fā)布,也可以生成JAR包發(fā)布,那么它們有什么區(qū)別呢2022-11-11
詳解JavaScript中的函數(shù)聲明和函數(shù)表達(dá)式
這篇文章主要介紹了詳解JavaScript中的函數(shù)聲明和函數(shù)表達(dá)式,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-08-08
關(guān)于@SpringBootApplication詳解
這篇文章主要介紹了關(guān)于@SpringBootApplication的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
基于springboot 長輪詢的實(shí)現(xiàn)操作
這篇文章主要介紹了基于springboot 長輪詢的實(shí)現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
用Java實(shí)現(xiàn)全國天氣預(yù)報的api接口調(diào)用示例
查詢天氣預(yù)報在APP中常用的一個常用功能,本文實(shí)例講述了java調(diào)用中國天氣網(wǎng)api獲得天氣預(yù)報信息的方法。分享給大家供大家參考。2016-10-10
使用jpa的時候set實(shí)體類屬性自動持久化的解決方案
這篇文章主要介紹了使用jpa的時候set實(shí)體類屬性自動持久化的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

