一篇文章學會日誌logback的使用
1、Logback為取代log4j而生
java日誌有:slf4j,log4j,logback,common-logging
slf4j:是規範/介面
日誌實現:log4j,logback,common-logging等
Logback是由log4j創始人Ceki Gülcü設計的又一個開源日誌元件。logback當前分成三個模組:logback-core,logback- classic和logback-access。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId >slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.7</version>
</dependency>
<!--實現slf4j介面並整合-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId >
<version>1.1.7</version>
</dependency>
2、Logback的核心物件:Logger、Appender、Layout
Logback主要建立於Logger、Appender 和 Layout 這三個類之上。
- Logger:日誌的記錄器,把它關聯到應用的對應的context上後,主要用於存放日誌物件,也可以定義日誌型別、級別。Logger物件一般多定義為靜態常量.
- Appender:用於指定日誌輸出的目的地,目的地可以是控制檯、檔案、遠端套接字伺服器、 MySQL、 PostreSQL、Oracle和其他資料庫、 JMS和遠端UNIX Syslog守護程序等。
- Layout:負責把事件轉換成字串,格式化的日誌資訊的輸出。
3、Level 有效級別
Logger可以被分配級別。級別包括:TRACE、DEBUG、INFO、WARN和ERROR,定義於ch.qos.logback.classic.Level類。程式會列印高於或等於所設定級別的日誌,設定的日誌等級越高,打印出來的日誌就越少。如果設定級別為INFO,則優先順序高於等於INFO級別(如:INFO、 WARN、ERROR)的日誌資訊將可以被輸出,小於該級別的如DEBUG將不會被輸出。為確保所有logger都能夠最終繼承一個級別,根logger總是有級別,預設情況下,這個級別是DEBUG。
4、 三值邏輯
Logback的過濾器基於三值邏輯(ternary logic),允許把它們組裝或成鏈,從而組成任意的複合過濾策略。過濾器很大程度上受到Linux的iptables啟發。這裡的所謂三值邏輯是說,過濾器的返回值只能是ACCEPT、DENY和NEUTRAL的其中一個。
如果返回DENY,那麼記錄事件立即被拋棄,不再經過剩餘過濾器;
如果返回NEUTRAL,那麼有序列表裡的下一個過濾器會接著處理記錄事件;
如果返回ACCEPT,那麼記錄事件被立即處理,不再經過剩餘過濾器。
5、Filter 過濾器
Logback-classic提供兩種型別的過濾器:常規過濾器和TuroboFilter過濾器。Logback整體流程:
- Logger 產生日誌資訊;
- Layout修飾這條msg的顯示格式;
- Filter過濾顯示的內容;
- Appender具體的顯示,即儲存這日誌資訊的地方。
LogBack配置檔案:logback.xml
檔案存放在resources目錄下:
<configuration>
<!--輸出console-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!--輸出格式-->
<encoder>
<pattern>%d{HH:mm:ss} %-5level [%thread] %logger{36}.%M - %msg%n
</pattern>
</encoder>
</appender>
<!--輸出到檔案-->
<appender name="MQTTPubFILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--訊息過濾 debug執行日誌,否則拋棄-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY </onMismatch>
</filter>
<!--日誌輸出的檔名,路徑專案根目錄-->
<file>mqttPub.log</file>
<!--時間回滾,當天的記錄記錄在當天的已時間命名的檔案中-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>mqttPub.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- keep 3 days' worth of history -->
<maxHistory>3</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss} %msg%n</pattern>
</encoder>
</appender>
<logger name="類路徑" level="debug">
<!--指定日誌輸出方式,引用定義的appender-->
<appender-ref ref="MQTTSubFILE" />
</logger>
<!-- 日誌輸出規則 根據當前ROOT 級別,日誌輸出時,級別高於root預設的級別時 會輸出 -->
<!-- 列印info級別日誌及以上級別日誌 -->
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>
即當root為info級別時,在程式碼中通過logger指定的輸出級別低於info時,日誌是不會輸出的.
最終決定你日誌輸出級別的是你在具體程式碼中呼叫Logger類決定的,而不是<
logger>
標籤,但是你的Logger呼叫級別不能低於標籤指定的級別.也意味著如果你的logger標籤沒有指定級別,那麼程式碼中輸出日誌時不能低於root標籤的級別
root 是日誌級別的最高階,如果定義一個logger沒有指定level那麼模式繼承root的級別。同時日誌預設會向上傳遞,即自己定義的logger執行完成後會交給root處理,也就是此時該日誌會被處理兩次:你自己的日誌一次,root處理一次,但可以通過設定additivity屬性來避免(預設為true):
<logger name="logback.LogbackDemo" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
LogBack在程式碼中的使用:
private static final Logger logger = LoggerFactory.getLogger(xxx.class);
logger.debug(xxx);