Logback介紹 Logback是由log4j創始人設計的又一個開源日誌組件。logback當前分成三個模塊:logback core,logback classic和logback access。logback core是其它兩個模塊的基礎模塊。logback classic是log4j的一個 ...
Logback介紹
Logback是由log4j創始人設計的又一個開源日誌組件。logback當前分成三個模塊:logback-core,logback- classic和logback-access。logback-core是其它兩個模塊的基礎模塊。logback-classic是log4j的一個 改良版本。此外logback-classic完整實現SLF4J API使你可以很方便地更換成其它日誌系統如log4j或JDK14 Logging。logback-access訪問模塊與Servlet容器集成提供通過Http來訪問日誌的功能。
Logback的優點
- 執行速度快,初始化記憶體載入小;
- 原生實現了 SLF4J API,不需要進行轉換;
- 配置簡單,並可以適應多種環境;
- 可以定時的刪除過期日誌;
- 更為強大的過濾器,不必因更改日誌級別而產生大量的日誌;
- 可以從 IO 錯誤中進行恢復;
- ....
關於logback的優點還有很多,這裡我就不一一列舉了。詳細的可以查看官方的Api文檔。
地址:https://logback.qos.ch/documentation.html
Logback的配置說明
關於這塊的配置說明,我就簡單的列舉一些比較常用配置來進行說明。如果還想瞭解更多,請看官方的文檔說明。
Logback的層級說明
簡單的層級結構,實際有更多,僅供參考。
configuration
root
logger
property
appender
layout
rollingPolicy
Pattern
fileNamePattern
maxFileSize
maxHistory
totalSizeCap
具體說明
configuration 根節點, 一般有三個屬性,分別是scan、scanPeriod和debug。
- scan:是否自動載入,預設為true。
- scanPeriod:監聽修改時間間隔,預設一分鐘。
- debug: 是否查看logback運行狀態,預設true。
那麼我們要使用這個的話,可以進行如下配置:
<configuration scan="true" scanPeriod="30 seconds" debug="true">
...
</configuration>
root 和logger 子節點,用於指定輸入的日誌級別。
- root :這個是指定主日誌的級別。
- logger :這個是指定自定義日誌的級別。
說明:root 指定的日誌級別就是用類進行輸出的日誌,例如:
private static Logger LOG = LoggerFactory.getLogger(logbackTest.class);
logger 指定的日誌級別是自定義的級別,例如:
private static Logger LOG2 = LoggerFactory.getLogger("oneInfo");
他們的用法如下:
<logger name="oneInfo" level="DEBUG" additivity="false">
<appender-ref ref="ONE_INFO" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE" />
</root>
說明二: level 是日誌輸出的級別,additivity表示是否在控制台列印該日誌。
property 子節點,一般用來定義變數值。有兩個屬性name和value。類似Java中Map的key和value。
- name: 變數的名稱
- value: 變數的值
用法如下:
<property name="LOG_HOME" value="logs/pcm"/>
說明:value指定的文件路徑,會在項目同級目錄下自動生成,無需手動創建。
appender 子節點,負責寫日誌的組件。有兩個屬性,name和class。
- name: 自定義名稱。
- class:對應自定義名稱的全限定名,就是使用何種方式進行日誌的輸出。
這個非常重要,也可以說是logback的核心吧。簡單的用法如下:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
</appender>
說明:定義一個STDOUT名稱,在控制台進行輸出。
layout和Pattern 這兩個一般是一起使用的。
- layout:格式化日誌信息;
- Pattern :layout 子節點,定義輸出信息的格式;
簡單的用法如下:
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n
</Pattern>
</layout>
說明:Pattern裡面格式的%d表示輸出的時間格式,%thread 表示輸出的線程名稱,%-5level 表示字元寬度,%msg 表示輸出的信息,%n表示換行。
rollingPolicy、fileNamePattern、maxFileSize、 maxHistory和totalSizeCap 這些一般用於對日誌進行滾動,也就是日誌切割管理之類的。
- rollingPolicy: 決定日誌滾動行為,一般用於日誌切割。
- fileNamePattern:必要的節點,一般用於指定日誌的文件的路徑以及生成格式。
- maxFileSize:單個日誌文件最大值,達到之後就進行切割。
- maxHistory:日誌文件最多保留的天數,也就是過期時間。
- totalSizeCap : 日誌文件總體的最大值,達到之後就不再產生日誌。
簡單的用法如下:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>31</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
</appender>
說明:這段的配置意義是,每天產生一個日誌文件,如果超出了10M,日誌就進行切割,並且在日誌文件名稱上加一,日誌文件最多保持31天,日誌文件總共最大為10G。
Logback使用說明
在對logback日誌的配置文件進行了簡單的說明之後,那我們來簡單的使用logback吧。
logback.xml 使用需要依賴三個 jar 包,分別是 slf4j-api,logback-core,logback-classic。
mavan配置如下:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
成功在maven添加依賴包之後,我們寫個簡單的demo來測試下吧。
定義三個log日誌,一個主log,兩個自定義log。
整體配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds" debug="true">
<property name="LOG_HOME" value="logs/pcm"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n
</Pattern>
</layout>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>31</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n
</Pattern>
</layout>
</appender>
<appender name="ONE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${LOG_HOME}/oneInfo/%d{yyyy-MM-dd}/oneInfo.%i.txt</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>31</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n
</Pattern>
</layout>
</appender>
<appender name="TWO_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${LOG_HOME}/twoInfo/%d{yyyy-MM-dd}/twoInfo.%i.txt</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>31</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n
</Pattern>
</layout>
</appender>
<logger name="oneInfo" level="DEBUG" additivity="false">
<appender-ref ref="ONE_INFO" />
</logger>
<logger name="twoInfo" level="WARN" additivity="true">
<appender-ref ref="TWO_INFO" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE" />
</root>
</configuration>
然後分別在控制台輸出和文件中進行輸出。
該java的代碼示例如下:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* Title: logbackTest
* Description:
* logback日誌測試
* Version:1.0.0
* @author pancm
* @date 2018年1月24日
*/
public class logbackTest {
private static Logger LOG = LoggerFactory.getLogger(logbackTest.class);
private static Logger LOG2 = LoggerFactory.getLogger("oneInfo");
private static Logger LOG3 = LoggerFactory.getLogger("twoInfo");
public static void main(String[] args) {
test();
}
private static void test(){
LOG.debug("主程式的debug");
LOG.info("主程式的info");
LOG.warn("主程式的warn");
LOG.error("主程式的error");
LOG2.debug("oneInfo的debug");
LOG2.info("oneInfo的info");
LOG2.warn("oneInfo的warn");
LOG2.error("oneInfo的error");
LOG3.debug("twoInfo的debug");
LOG3.info("twoInfo的info");
LOG3.warn("twoInfo的warn");
LOG3.error("twoInfo的error");
}
輸出結果如下:
日誌的生成目錄:
輸出結果的說明:
- LOG: 因為設置列印的級別是info,所以debug級別的不會列印 。
- LOG2: 因為自定義配置設定的是 additivity="false" 不在控制台列印。 所以一條都不會列印,但是debug級別以上的日誌可以在logs/pcm/oneInfo中查看。
- LOG3: 因為自定義配置設定的是 additivity="true" 可以在控制台列印。所以會列印兩條warn級別的日誌,日誌也可以在logs/pcm/oneInfo中查看。
其它
參考:
https://logback.qos.ch/documentation.html
https://www.cnblogs.com/warking/p/5710303.html
到此,本文的logback日誌簡單講解結束,謝謝閱讀!