Logback的使用及如何配置
日志在項目開發(fā)過程的作用不言而喻,項目上線后,我們需要根據(jù)日志文件定位問題發(fā)生的位置以及產(chǎn)生的原因。以前在項目開發(fā)中,已經(jīng)有前人在工程中配置過日志,所以完全不需要自己再進行日志的配置。這次在新的項目中自己來配置日志時,還是遇到了一些波折,下面慢慢道來。
1 為什么選用Logback?
目前,在Springboot工程體系中,使用較多的日志組件是Slf4j、Logback以及Log4j2。而Slf4j本身只是一個接口類,具體的實現(xiàn)還是由Logback或Log4j2來完成的。由于Springboot自身就集成了Logback,默認使用的日志組件是Logback,Logback的體系結(jié)構(gòu)具有足夠的通用性,可以在不同的場景下使用。因此,在我們的DRS工程中,使用了Logback進行日志的打印。
目前,Logback包含三個部分:logback-core, logback-classic, logback-access。 Logback-core: 為其他兩個模塊奠定了基礎(chǔ) Logback-classic: 可以被同化為log4j的一個顯著改進的版本,此外, logback-classic實現(xiàn)了slf4japi,因此您可以方便地在logback和其他日志框架(如log4j或log4j)之間來回切換java.util.logging文件 Logback-access: 集成了Servlet容器(如Tomcat和Jetty),以提供HTTP訪問日志功能。
如果使用的是Springboot是2.4版本及以上,則不需要另外引入logback-core, logback-classic, logback-access和slf2j-api的依賴包的。
2 Logback的配置
首先,看一下我們在DRS工程中使用的Logback配置文件:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="log.path" value="/duan/drs-server/logs" /> <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <!-- 系統(tǒng)debug日志輸出 --> <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/drs-server-debug.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/drs-server-debug.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 系統(tǒng)info日志輸出 --> <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/drs-server-info.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/drs-server-info.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 系統(tǒng)warn日志輸出 --> <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/drs-server-warn.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/drs-server-warn.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 系統(tǒng)error日志輸出 --> <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/drs-server-error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/drs-server-error.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <logger name="com.nuonuo.middleware.drsserver" level="INFO" /> <logger name="org.springframework" level="warn" /> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE_DEBUG" /> <appender-ref ref="FILE_INFO" /> <appender-ref ref="FILE_WARN" /> <appender-ref ref="FILE_ERROR" /> </root> </configuration>
說明:
屬性 | 說明 |
---|---|
log.path | 定義日志文件的輸出路徑 |
log.pattern | 定義日志文件輸出格式 |
appender | 定義了日志的輸出文件,日志文件保留時長,使用何種模式輸出,以及過濾規(guī)則。在上述文件中,分別針對DEBUG、INFO、WARN和ERROR日志進行了定義了四個Appender |
logger | 用來設(shè)置某一個類或某個包的日志打印級別。在上述配置中,我們將DRS工程的日志輸出級別定義為INFO,那么,如果只想打印出DRS工程中的日志,則只需將打印級別level設(shè)置為WARN |
root | 是一個根logger,root下可以包含零個或多個appender。如果一個appender沒有在root下引入,則不會生成對應(yīng)的日志文件 |
3 Logback的輸出格式
針對以上述配置中的格式進行說明:
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n
字段 | 說明 |
---|---|
%d{HH:mm:ss.SSS} | 用于輸出日志事件的日期,其中%d也可以替換成%date,該設(shè)置對應(yīng)下圖中的紅色標記部分 |
[%thread] | 輸出對應(yīng)的線程名。在上面的截圖中可以看到,輸出線程是主線程main |
%-5level | 輸出日志級別,其中-5表示如果記錄器名稱長度小于5個字符,則右鍵填充空格 |
%logger{20} | 輸出日志事件起源處記錄器的名稱。其中20表示輸出記錄的名稱長度限制,超過這個長度,記錄器名將會進行縮寫。但是,記錄器名稱中最右邊的段從不縮寫,即使其長度比“長度”選項長。其他段可以縮短到最多一個字符,但永遠不會刪除 |
[%method,%line] | %method 輸出發(fā)出日志記錄請求的方法名稱,%method也可替換成%M; %line——輸出發(fā)出日志記錄請求的行號,%line也可替換成%L |
%msg | 輸出應(yīng)用程序提供的與日志事件關(guān)聯(lián)的消息。其中%msg也可替換成%m或%message |
%n | 輸出平臺相關(guān)的行分隔符字符 |
4 Appender
Appender子類包含F(xiàn)ilter、Encoder、ConsoleAppender、FileAppender、以及RollingFileAppender。其類圖關(guān)系如下所示。
顧名思義目標文件由file選項指定。如果該文件已存在,則根據(jù)append屬性的值將其追加或截斷。RollingFileAppender 擴展了FileAppender,具有滾動更新日志文件的功能。
類名 | encoder | immediateFlush | target | withJansi | append | file | prudent | rollingPolicy | triggeringPolicy |
---|---|---|---|---|---|---|---|---|---|
OutputStreamAppender | √ | √ | |||||||
ConsoleAppender | √ | √ | √ | √ | |||||
FileAppender | √ | √ | - | - | √ | √ | √ | ||
RollingFileAppender | √ | √ | - | - | √ | √ | √ | √ | √ |
OutputStreamAppender 這個類提供了其他附加程序構(gòu)建的基本服務(wù)。該類包含兩個屬性設(shè)置: encoder—— 確定日志寫入的編碼格式。 immediateFlush——布爾值,默認為true, 立即刷新輸出流可確保立即寫出日志事件,并且在應(yīng)用程序退出而未正確關(guān)閉附加器時不會丟失這些事件。 另一方面,將此屬性設(shè)置為“false”可能會使日志吞吐量增加四倍。同樣,如果immediateFlush設(shè)置為“false”,并且應(yīng)用程序退出時appender未正確關(guān)閉,則尚未寫入磁盤的日志事件可能會丟失。
ConsoleAppender 將日志附加在控制臺上,其包含三個屬性: encoder——略 target—— System.out或者 System.err字符串值之一 默認目標是 System.out withJansi——布爾值,默認false。 將withJansi設(shè)置為true將激活Jansi庫,該庫為Windows機器上的ANSI顏色代碼提供支持。在Windows主機上,如果此屬性設(shè)置為true,則應(yīng)將網(wǎng)址:org.fusesource.jansi:jansi:1.17“在類路徑上進行設(shè)置。請注意,基于Unix的操作系統(tǒng)(如Linux和macosx)默認支持ANSI顏色代碼。一般我們很少用到,使用默認值即可。
FileAppender 它將日志事件附加到文件中,其包含四個屬性: append——布爾值,默認為true, 表示事件附加在現(xiàn)有文件的末尾。如果append為false,則任何現(xiàn)有文件都將被截斷。 encoder——略 file—— 要寫入的文件的名稱, 如果文件不存在,則創(chuàng)建該文件。 如果文件的父目錄不存在,F(xiàn)ileAppender將自動創(chuàng)建它,包括任何必要但不存在的父目錄。 prudent——布爾值,默認值為false。如果設(shè)置為true, FileAppender將安全地寫入指定的文件,即使存在運行在不同jvm(可能運行在不同主機上)中的其他FileAppender實例。
RollingFileAppender 擴展了FileAppender,具有滾動更新日志文件的功能,其包含以下幾個屬性: file——略 append——略 encoder——略 rollingPolicy—— 此選項是在發(fā)生滾動時指定RollingFileAppender行為的組件,包含SizeAndTimeBasedRollingPolicy、FixedWindowRollingPolicy、TimeBasedRollingPolicy。在上述配置中我們使用的是最為廣泛的TimeBasedRollingPolicy。 triggeringPolicy—— 此選項是通知RollingFileAppender何時激活滾動更新過程的組件 prudent——布爾值,當(dāng)為true時,不支持FixedWindowRollingPolicy。
5 Logback使用過程中遇到的問題
起初,在配置完logback.xml文件后,始終無法將日志輸出到指定目錄。 第一步,調(diào)試確認使用的是logback組件; 第二步,引入logback-core、logback-classic、logback-access和slf4j-api對應(yīng)的jar包,驗證是否可以將日志輸出到指定目錄。驗證后發(fā)現(xiàn),仍然無法解決問題,于是將引入的jar包刪除。 第三步,排除springboot中包含的log4j2相關(guān)的jar,驗證后仍無法解決問題。 第四步,在網(wǎng)上查到可能跟配置文件的命名有關(guān),有說logback-spring.xml加載的優(yōu)先級最高,于是將文件名由logback.xml改為logback-spring.xml,但是仍然無法解決問題。官網(wǎng)上看到的加載順序是: logback-test.xml> logback.groovy> logback.xml。具體可見官方文檔logback.qos.ch/manual/conf… 第五步,懷疑可能沒加載logback.xml文件,于是在application.properties中加入logging.config=classpath:logback.xml,啟動工程時報錯,錯誤信息是: class path resource [logback.xml] cannot be resolved to URL because it does not exist。
根據(jù)錯誤信息可以看到,系統(tǒng)中根本沒有加載到logback.xml文件。 第六步,由于第五步驗證系統(tǒng)根本沒有加載到logback.xml文件,于是檢查了一下pom.xml文件,發(fā)現(xiàn)在build時,沒有引入資源文件,于是修改pom.xml文件,添加如下內(nèi)容,成功將日志輸出到指定目錄。
<resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource>
以上就是Logback的使用及如何配置的詳細內(nèi)容,更多關(guān)于Logback的使用和配置的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java深入數(shù)據(jù)結(jié)構(gòu)理解掌握抽象類與接口
在類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類稱為抽象類,接口是Java中最重要的概念之一,它可以被理解為一種特殊的類,不同的是接口的成員沒有執(zhí)行體,是由全局常量和公共的抽象方法所組成,本文給大家介紹Java抽象類和接口,感興趣的朋友一起看看吧2022-05-05elasticsearch節(jié)點的transport請求發(fā)送處理分析
這篇文章主要為大家介紹了elasticsearch節(jié)點的transport請求發(fā)送處理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04java實現(xiàn)1M圖片壓縮優(yōu)化到100kb實現(xiàn)示例
這篇文章主要為大家介紹了java實現(xiàn)1M圖片壓縮優(yōu)化到100kb示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07Java?IO網(wǎng)絡(luò)模型實現(xiàn)解析
這篇文章主要為大家介紹了Java?IO網(wǎng)絡(luò)模型實現(xiàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03Java實現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址
這篇文章主要介紹了如何利用Java語言實現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址,文中的示例代碼講解詳細,對我們學(xué)習(xí)有一定的參考價值,快跟隨小編一起學(xué)習(xí)一下吧2022-06-06