日志在項目開發(fā)過程的作用不言而喻,項目上線后,我們需要根據日志文件定位問題發(fā)生的位置以及產生的原因。以前在項目開發(fā)中,已經有前人在工程中配置過日志,所以完全不需要自己再進行日志的配置。這次在新的項目中自己來配置日志時,還是遇到了一些波折,下面慢慢道來。
1 為什么選用Logback?
目前,在Springboot工程體系中,使用較多的日志組件是Slf4j、Logback以及Log4j2。而Slf4j本身只是一個接口類,具體的實現還是由Logback或Log4j2來完成的。由于Springboot自身就集成了Logback,默認使用的日志組件是Logback,Logback的體系結構具有足夠的通用性,可以在不同的場景下使用。因此,在我們的DRS工程中,使用了Logback進行日志的打印。
目前,Logback包含三個部分:logback-core, logback-classic, logback-access。 Logback-core: 為其他兩個模塊奠定了基礎 Logback-classic: 可以被同化為log4j的一個顯著改進的版本,此外, logback-classic實現了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>
- <!-- 系統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>
- <!-- 系統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>
- <!-- 系統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>
- <!-- 系統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 | 用來設置某一個類或某個包的日志打印級別。在上述配置中,我們將DRS工程的日志輸出級別定義為INFO,那么,如果只想打印出DRS工程中的日志,則只需將打印級別level設置為WARN |
root | 是一個根logger,root下可以包含零個或多個appender。如果一個appender沒有在root下引入,則不會生成對應的日志文件 |
3 Logback的輸出格式
針對以上述配置中的格式進行說明:
- %d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n
字段 | 說明 |
---|---|
%d{HH:mm:ss.SSS} | 用于輸出日志事件的日期,其中%d也可以替換成%date,該設置對應下圖中的紅色標記部分 |
[%thread] | 輸出對應的線程名。在上面的截圖中可以看到,輸出線程是主線程main |
%-5level | 輸出日志級別,其中-5表示如果記錄器名稱長度小于5個字符,則右鍵填充空格 |
%logger{20} | 輸出日志事件起源處記錄器的名稱。其中20表示輸出記錄的名稱長度限制,超過這個長度,記錄器名將會進行縮寫。但是,記錄器名稱中最右邊的段從不縮寫,即使其長度比“長度”選項長。其他段可以縮短到最多一個字符,但永遠不會刪除 |
[%method,%line] | %method 輸出發(fā)出日志記錄請求的方法名稱,%method也可替換成%M; %line——輸出發(fā)出日志記錄請求的行號,%line也可替換成%L |
%msg | 輸出應用程序提供的與日志事件關聯的消息。其中%msg也可替換成%m或%message |
%n | 輸出平臺相關的行分隔符字符 |
4 Appender
Appender子類包含Filter、Encoder、ConsoleAppender、FileAppender、以及RollingFileAppender。其類圖關系如下所示。
顧名思義目標文件由file選項指定。如果該文件已存在,則根據append屬性的值將其追加或截斷。RollingFileAppender 擴展了FileAppender,具有滾動更新日志文件的功能。
類名 | encoder | immediateFlush | target | withJansi | append | file | prudent | rollingPolicy | triggeringPolicy |
---|---|---|---|---|---|---|---|---|---|
OutputStreamAppender | √ | √ | |||||||
ConsoleAppender | √ | √ | √ | √ | |||||
FileAppender | √ | √ | - | - | √ | √ | √ | ||
RollingFileAppender | √ | √ | - | - | √ | √ | √ | √ | √ |
OutputStreamAppender 這個類提供了其他附加程序構建的基本服務。該類包含兩個屬性設置: encoder—— 確定日志寫入的編碼格式。 immediateFlush——布爾值,默認為true, 立即刷新輸出流可確保立即寫出日志事件,并且在應用程序退出而未正確關閉附加器時不會丟失這些事件。 另一方面,將此屬性設置為“false”可能會使日志吞吐量增加四倍。同樣,如果immediateFlush設置為“false”,并且應用程序退出時appender未正確關閉,則尚未寫入磁盤的日志事件可能會丟失。
ConsoleAppender 將日志附加在控制臺上,其包含三個屬性: encoder——略 target—— System.out或者 System.err字符串值之一 默認目標是 System.out withJansi——布爾值,默認false。 將withJansi設置為true將激活Jansi庫,該庫為Windows機器上的ANSI顏色代碼提供支持。在Windows主機上,如果此屬性設置為true,則應將網址:org.fusesource.jansi:jansi:1.17“在類路徑上進行設置。請注意,基于Unix的操作系統(如Linux和macosx)默認支持ANSI顏色代碼。一般我們很少用到,使用默認值即可。
FileAppender 它將日志事件附加到文件中,其包含四個屬性: append——布爾值,默認為true, 表示事件附加在現有文件的末尾。如果append為false,則任何現有文件都將被截斷。 encoder——略 file—— 要寫入的文件的名稱, 如果文件不存在,則創(chuàng)建該文件。 如果文件的父目錄不存在,FileAppender將自動創(chuàng)建它,包括任何必要但不存在的父目錄。 prudent——布爾值,默認值為false。如果設置為true, FileAppender將安全地寫入指定的文件,即使存在運行在不同jvm(可能運行在不同主機上)中的其他FileAppender實例。
RollingFileAppender 擴展了FileAppender,具有滾動更新日志文件的功能,其包含以下幾個屬性: file——略 append——略 encoder——略 rollingPolicy—— 此選項是在發(fā)生滾動時指定RollingFileAppender行為的組件,包含SizeAndTimeBasedRollingPolicy、FixedWindowRollingPolicy、TimeBasedRollingPolicy。在上述配置中我們使用的是最為廣泛的TimeBasedRollingPolicy。 triggeringPolicy—— 此選項是通知RollingFileAppender何時激活滾動更新過程的組件 prudent——布爾值,當為true時,不支持FixedWindowRollingPolicy。
5 Logback使用過程中遇到的問題
起初,在配置完logback.xml文件后,始終無法將日志輸出到指定目錄。 第一步,調試確認使用的是logback組件; 第二步,引入logback-core、logback-classic、logback-access和slf4j-api對應的jar包,驗證是否可以將日志輸出到指定目錄。驗證后發(fā)現,仍然無法解決問題,于是將引入的jar包刪除。 第三步,排除springboot中包含的log4j2相關的jar,驗證后仍無法解決問題。 第四步,在網上查到可能跟配置文件的命名有關,有說logback-spring.xml加載的優(yōu)先級最高,于是將文件名由logback.xml改為logback-spring.xml,但是仍然無法解決問題。官網上看到的加載順序是: 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。
根據錯誤信息可以看到,系統中根本沒有加載到logback.xml文件。 第六步,由于第五步驗證系統根本沒有加載到logback.xml文件,于是檢查了一下pom.xml文件,發(fā)現在build時,沒有引入資源文件,于是修改pom.xml文件,添加如下內容,成功將日志輸出到指定目錄。
- <resource>
- <directory>src/main/resources</directory>
- <includes>
- <include>**/*.xml</include>
- </includes>
- <filtering>false</filtering>
- </resource>
以上就是Logback的使用及如何配置的詳細內容,更多關于Logback的使用和配置的資料請關注服務器之家其它相關文章!
原文鏈接:https://juejin.cn/post/6944961954796535816