logback快速入門 配置和使用
https://www.jianshu.com/p/851cba89c37a
logback快速入門
2017.02.26 22:58* 字數 1000 閱讀 313評論 0喜歡 1
一、slf4j
The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks, such as java.util.logging, logback and log4j. SLF4J allows the end-user to plug in the desired logging framework at deployment time.
簡單日誌門面(SLF4J)為各種日誌框架提供了一個簡單的介面,使得使用者能夠在部署的時候配置其所希望的日誌系統。
在實際的開發過程中,可能會使用各種不同的日誌系統,每個日誌系統的風格、樣式和佈局也不盡相同,在不同日誌系統之間進行切換耗時耗力。使用slf4j無需考慮具體使用哪個日誌系統,統一使用slf4j的API進行開發。當要在不同日誌系統之間進行切換時,只需要選擇對應的日誌系統包即可,十分靈活方便(當然,日誌系統本身的jar包和配置檔案還是需要的)。還有一點好處是,slf4j能夠支援多個引數,並且通過{}佔位符進行替換,避免了各種各樣的判斷條件,從而提升了效能。
到官網下載最新版本的slf4j,解壓縮。slf4j-api-<version>.jar是slf4j的核心jar包。除此之外,還包含許多與日誌系統對應的jar包。
slf4j中與各日誌系統之間的對應關係如下:
二、logback
Logback是一款開源的日誌元件,可以應用在不同的環境下。主要包括三個模組:logback-core、logback-classic和logback-access。
logback-core是其他模組的基礎模組。logback-classic可以看做是log4j的改良版本,完整地實現了slf4j API,使得logback可以與其他日誌系統自由切換。logback-access整合Servlet容器,提供通過http訪問日誌的功能。
Logback由三個主要的類構建而成:Logger、Appender和Layout。Logger是日誌的記錄器,主要用於存放日誌物件,也可以定義日誌型別和級別。Appender主要用於指定日誌的輸出目標,輸出目標可以是控制檯、檔案、資料庫等。Layout主要負責格式化日誌資訊。
Logger的級別按照優先順序的高低順序分為:ERROR、WARN、INFO、DEBUG、TRACE。
三、下載與配置
到官網下載最新版本的logback,解壓縮。
通常,在classpath目錄下建立一個logback.xml來進行logback的配置。如果沒有建立配置檔案,logback會呼叫BasicConfigurator,建立一個預設的最小化配置。
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- Assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
四、配置說明
配置檔案以<configuration>開始,包含一個<root>元素、若干<appender>元素以及若干<logger>元素。
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:當設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true。
scanPeriod:設定監測配置檔案是否有修改的時間間隔,預設單位是毫秒。
當scan為true時,此屬性生效。預設的時間間隔為1分鐘。
debug:當設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。
預設值為false。
-->
<configuration scan="false" scanPeriod="60 seconds" debug="false">
<!-- 定義日誌的根目錄 -->
<property name="LOG_HOME" value="/app/log" />
<!-- 定義日誌檔名稱 -->
<property name="appName" value="netty"></property>
<!-- 控制檯輸出 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<Encoding>UTF-8</Encoding>
<!-- 日誌輸出格式:
%d表示日期時間
%thread表示執行緒名
%-5level表示級別從左向右顯示5個字元寬度
%logger{50}表示logger名字最長50個字元,否則按照句點分割
%msg表示日誌訊息
%n表示換行符
-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</layout>
</appender>
<!-- 滾動檔案輸出。當符合某個條件時,將日誌記錄滾動到其他檔案 -->
<appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Encoding>UTF-8</Encoding>
<!-- 指定日誌檔案的名稱 -->
<file>${LOG_HOME}/${appName}.log</file>
<!--
制定滾動策略,涉及檔案移動和重新命名。
TimeBasedRollingPolicy: 最常用的滾動策略,它根據時間來制定滾動策略,
既負責滾動也負責觸發滾動。
-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--
滾動時產生的檔案的存放位置及檔名稱
%d{yyyy-MM-dd}表示按天進行滾動
%i表示當檔案大小超過maxFileSize時,按照i進行檔案滾動
-->
<fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!--
可選節點,控制保留的歸檔檔案的最大數量,超出數量就刪除舊檔案。
假設設定每天滾動,且maxHistory是365,則只儲存最近365天的檔案,
刪除之前的舊檔案。注意,刪除舊檔案時,那些為了歸檔而建立的目錄也會被刪除。
-->
<MaxHistory>365</MaxHistory>
<!--
當日志文件超過maxFileSize指定的大小時,根據上面提到的%i進行日誌檔案滾動。
注意此處配置SizeBasedTriggeringPolicy是無法實現按檔案大小進行滾動的,
必須配置timeBasedFileNamingAndTriggeringPolicy
-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 日誌輸出格式 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
</layout>
</appender>
<!--
name:表示匹配的logger型別字首,也就是包的前半部分
level:表示要記錄的日誌級別
additivity:作用在於children-logger是否使用rootLogger配置的appender進行輸出,
false:表示只用當前logger的appender-ref,
true:表示當前logger的appender-ref和rootLogger的appender-ref都有效
-->
<!-- hibernate logger -->
<logger name="org.hibernate" level="error" />
<!-- Spring framework logger -->
<logger name="org.springframework" level="error" additivity="false"></logger>
<!--
root與logger是父子關係,沒有特別定義則預設為root。
任何一個類只會和一個logger對應,要麼是定義的logger,要麼是root。
判斷的關鍵在於找到這個logger,然後判斷這個logger的appender和level。
-->
<root level="info">
<appender-ref ref="stdout" />
<appender-ref ref="appLogAppender" />
</root>
</configuration>
五、用法
通常,logback與slf4j一同使用。
- 建立logback.xml配置檔案
- 在Java程式中引入slf4j的jar包:org.slf4j.Logger和org.slf4j.LoggerFactory
- 在Java類中使用slf4j的API記錄日誌
所有的logger都關聯到一個LoggerContext物件,由它負責logger的建立和排列。通過LoggerFactory類的靜態方法getLogger()取得所建立的logger例項,引數為當前類名,然後呼叫logger中與級別對應的列印方法來輸出日誌。
final static Logger logger = LoggerFactory.getLogger(this.class);
logger.info("logback info");
如果想檢視logback內部狀態資訊,可以先通過slf4j的LoggerFactory.getLoggerFactory()方法建立一個LoggerContext例項,然後呼叫logback核心包中的靜態類StatusPrinter的print()方法列印日誌資訊。
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
StatusPrinter.print(lc);
執行時,將與所希望使用的日誌系統對應的jar包新增到classpath,這樣就切換到該日誌系統。最終,在部署時實現不同日誌系統之間的自由切換,與開發分離。