springboot使用logback自定義日志的詳細過程
前言
1、末尾有完整配置文件
2、日志分為五個等級,按照優(yōu)先級的高低可以分為:
TRANCE < DEBUG < INFO < WARN < ERROR
springboot默認是INFO,因此低于INFO的TRACE和DEBUG都不會輸出。
可以在properties或yaml配置文件中修改日志級別:
logging:
level:
root: debug這里的root可以換成包名,精細控制不同包的日志輸出級別,比如:
logging:
level:
com.example.controller: debug
com.example.mapper: error3、其次,logback的日志分為控制臺日志和文件日志。
控制臺日志:也就是我們IDE運行項目時,控制臺打印的信息。
文件日志:項目運行時,將運行信息寫入到指定文件。需要在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
如果想驗證一下,可以將下方概覽中的配置文件復制到自己的項目中運行一下,觀察控制臺的日志輸出格式。
配置文件概覽
可以簡單先看一個配置文件的案例
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:當配置文件修改后,將會重新載入。
scanPeriod:設置檢測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。
debug:為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。默認值為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">
<!-- 設置日志文件的存放路徑和文件名,可根據(jù)實際情況修改 -->
<file>logs/app.log</file>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 配置根日志記錄器,設置日志級別為DEBUG,并將日志輸出到STDOUT和FILE這兩個Appender -->
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>這個文件主要定義了兩個Appender,分別輸出日志到控制臺和文件中。
其次定義root目錄的日志級別,并將兩個Appender配置到root目錄下,進行日志輸出。
這里的root標簽里面定義了level,有沒有感覺在哪里見過這個東西?
沒錯,上文講到,我們可以在properties或yaml配置文件中修改日志級別,在springboot配置文件中的操作,和這里的操作是等價的。那么按照同樣的道理,這里的root也可以細化成不同的包,配置不同的level和Appender。這里只是引出這個概念,具體的內(nèi)容放在下文。
配置項詳解
<configuration>:logback配置的根標簽。它包含三個屬性:scan、scanPeriod、debug。
scan:當配置文件修改后,將會重新載入。值為true或false。scanPeriod:時間間隔。每隔一段時間檢測一次配置文件是否被修改。值可以是60或12 second,數(shù)字是自定義的,不是非要填60或12,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。debug:是否打印logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。值為true或false(默認)。
<Appender>:可以理解成負責寫日志的工具人。一個Appender就是一個工具人。
<logger> :設置某一個包或具體的類的日志打印級別,以及指定的Appender(分配打工人)。
<root>:根logger,也是logger的一種,且只有一個level屬性。
contextName:每個logger都關聯(lián)到logger上下文,默認上下文名稱為default。但可以使用contextName標簽設置成其他名字,用于區(qū)分不同應用程序的記錄。
property:用來定義變量值的標簽,property標簽有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值。通過property定義的值會被插入到logger上下文中。定義變量后,可以使“${name}”來使用變量。
Appender的種類:
- ConsoleAppender:控制臺日志。
- FileAppender:文件日志。
- RollingFileAppender:滾動文件日志。會在日志文件達到某種條件后,創(chuàng)建新的日志文件繼續(xù)寫入日志。常見的條件是文件的大小,比如設置每個文件大小為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]:當前線程。
%-4relative:從程序啟動到當前日志記錄事件所經(jīng)過的相對時間。-表示左對齊,4表示4個字符寬度。
%logger{40}:輸出日志記錄器名稱的占位符,其中40是一個可選的參數(shù),用于指定輸出的日志記錄器名稱的最大長度。如果不指定{40}這樣的參數(shù),默認會輸出完整的日志記錄器名稱。
%msg:日志消息主體。
%n:換行。
%file:文件名。
%line:行號。
配置文件示例
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:當配置文件修改后,將會重新載入。
scanPeriod:設置檢測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。
debug:為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。默認值為false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志文件路徑,如果spring配置文件沒有對應值,使用默認值 -->
<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">
<!-- 設置文件路徑 -->
<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é)點時必選節(jié)點,用來指定最基礎的日志輸出級別,只有一個level屬性 -->
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
</configuration>給日志配置顏色
方式一、使用官方默認配置
只需要在xml配置文件里引入配置文件即可。
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
什么?你問我這個文件去哪里找?根據(jù)resource里面的路徑,去lib目錄的springboot依賴中找。
方式二、自定義顏色配置
使用形如%clr(){red}來給日志標簽配置顏色。
要使用%clr,有兩種方式:
第一種是引入方式一的默認配置文件,在該文件里面就幫我們引入了%clr。
第二種方式就是手動引入%clr,可以參考一下defaults.xml。
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
%clr支持的顏色:blue、cyan、faint、green、magenta、red、yellow
faint:淡色(控制臺默認顏色)
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怎么沒有顏色啊。
不要擔心,有解決辦法的。
這里提供兩種解決辦法:
第一種可以更改一下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,實現(xiàn)不同日志level不同顏色
*/
public class LevelHighLightColorConfig extends HighlightingCompositeConverter {
// 這里用的版本是springboot 2.6.13
// 如果你發(fā)現(xiàn)父類中的方法不是getForegroundColorCode,可能是版本差異造成的。
// 那么需要你對著父類ctrl+左鍵點擊,看看父類是怎么實現(xiàn)的
// 然后照貓畫虎繼續(xù)修改,核心邏輯就是判斷然后返回不同的顏色。
// 因為作者跟著AI配置的時候就遇到這種情況,也是模仿父類進行修改的。
@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:當配置文件修改后,將會重新載入。
scanPeriod:設置檢測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。
debug:為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。默認值為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配置文件沒有對應值,使用默認值 -->
<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">
<!-- 設置文件路徑 -->
<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é)點時必選節(jié)點,用來指定最基礎的日志輸出級別,只有一個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,設置文件,可以是絕對路徑,也可以是相對路徑。如:
logging.file=my.log - logging.path,設置目錄,會在該目錄下創(chuàng)建spring.log文件,并寫入日志內(nèi)容,如:
logging.path=/var/log
注:二者不能同時使用,如若同時使用,則只有l(wèi)ogging.file生效,可以看到這種方式配置簡單,但是能實現(xiàn)的功能也非常有限,如果想要更復雜的需求,就需要下面的定制化配置了。
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,需要引入默認的配置文件
<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)雅的配置日志
到此這篇關于springboot使用logback自定義日志的文章就介紹到這了,更多相關springboot logback自定義日志內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java使用自定義注解實現(xiàn)為事件源綁定事件監(jiān)聽器操作示例
這篇文章主要介紹了Java使用自定義注解實現(xiàn)為事件源綁定事件監(jiān)聽器操作,結合實例形式分析了java自定義注解、注解處理、事件監(jiān)聽與響應等相關操作技巧,需要的朋友可以參考下2019-10-10
Spring Boot環(huán)境屬性占位符解析及類型轉(zhuǎn)換詳解
這篇文章主要給大家介紹了關于Spring Boot環(huán)境屬性占位符解析及類型轉(zhuǎn)換的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-08-08
詳解Spring?Security?捕獲?filter?層面異常返回我們自定義的內(nèi)容
Spring?的異常會轉(zhuǎn)發(fā)到?BasicErrorController?中進行異常寫入,然后才會返回客戶端。所以,我們可以在?BasicErrorController?對?filter異常進行捕獲并處理,下面通過本文給大家介紹Spring?Security?捕獲?filter?層面異常,返回我們自定義的內(nèi)容,感興趣的朋友一起看看吧2022-05-05
SpringBoot集成thymeleaf渲染html模板的步驟詳解
這篇文章主要給大家詳細介紹了SpringBoot集成thymeleaf如何使實現(xiàn)html模板的渲染,文中有詳細的代碼示例,具有一定的參考價值,需要的朋友可以參考下2023-06-06
Spring MVC攔截器_動力節(jié)點Java學院整理
Spring MVC的攔截器,是屬于HandlerMapping級別的,可以有多個HandlerMapping ,每個HandlerMapping可以有自己的攔截器,具體內(nèi)容詳情大家通過本文學習吧2017-08-08

