優勢
看了一下Logback的官方文檔,說換成LogBack的原因大概有一下幾個:
1. 說是logBack的設計開發和log4j是同一批人員,重寫了內核,習慣上總體跟log4j一樣,不會有太多生疏感。在一些關鍵路徑上性能快樂很多, 初始化的內存更小。
2. 文檔說最推薦的一點是 logBack經過了比log4j更長時間和全面的測試,更加穩定。
3. Logback-classic非常自然實現了SLF4j:Logback-classic實現了SLF4j。在使用SLF4j中,你都感覺不到logback-classic。而且因為logback-classic非常自然地實現了slf4j , 所 以切換到log4j或者其他,非常容易,只需要提供成另一個jar包就OK,根本不需要去動那些通過SLF4JAPI實現的代碼
其他的雲雲就不細追究了。
配置部分:
LogBack有以下幾個模塊。
- logback-core:其它兩個模塊的基礎模塊
- logback-classic:它是log4j的一個改良版本,同時它完整實現了slf4j API使你可以很方便地更換成其它日志系統如log4j或JDK14 Logging
- logback-access:訪問模塊與Servlet容器集成提供通過Http來訪問日志的功能
logback的默認配置
如果配置文件 logback-test.xml 和 logback.xml 都不存在,那么 logback 默認地會調用BasicConfigurator ,創建一個最小化配置。最小化配置由一個關聯到根 logger 的ConsoleAppender 組成。輸出用模式為%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 進行格式化。root logger 默認級別是 DEBUG。
導入以下依賴
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
如果與spring集成,那么就在項目resource目錄下創建 logback-spring.xml文件,spring會自動識別。
配置文件示例和作用:
<?xml version="1.0" encoding="UTF-8"?> <!-- 根節點 , logback的全局配置 , 包含3個屬性 scan : 當文件發生變更時是否重載 , 默認值ture scanPeriod : 監測文件的間隔時間 , 即每隔多少時間掃描一次配置文件 僅當scan=true時生效. 默認間隔時間1min , 如果不寫單位默認是毫秒; debug : 是否為debug模式 , 為true時會打印出logack內部日志 , 便於查看logback實時信息 . 默認值false --> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 上下文名稱 , 每個logger都關聯到上下文 , 默認值為default . 設置之后不可動態修改 --> <contextName>logback</contextName> <!-- 定義變量 , 在配置文件其他地方可通過${變量名}訪問 --> <property name="appName" value="xdemo"/> <!-- 內部變量 , 獲取時間戳字符串 . key為變量名 , datePattern為解析的日期字符串格式 , 與SimpleDateFormat格式相同 --> <timestamp key="time" datePattern="yyyyMMdd HHmmss"/> <!-- 日志輸出組件 有兩個必須的屬性 name : 當前appender的名稱 , 在logger組件中相關聯 class : 日志的輸出控制類 , 通過class將日志輸出到控制台/文件/遠程socket服務器/數據庫等 不同的class有着不同的配置 --> <!-- ConsoleAppender , 將日志輸出到控制台 . 有encoder和target兩個子節點(新版本有filter子節點 , 在下文中詳細說明) --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <!-- 子節點encoder , 指定日志輸出的格式 , 具體格式配置見下方表格 --> <encoder> <pattern>%d{HH:mm:ss} [%thread][%X{traceId}] %-5level %logger{36} - %msg%n</pattern> </encoder> <!-- 子節點target , 日志輸出的對象 System.out 或 System.err --> <target></target> </appender> <!-- FileAppender , 將日志輸出到文件 . 有file/append/encoder/prudent四個子節點(新版本有filter子節點 , 在下文中詳細說明) --> <appender name="file" class="ch.qos.logback.core.FileAppender"> <!-- 子節點file , 輸出的目標文件名 , 父級目錄不存在會自動創建 . 無默認值 --> <file>xdemo.log</file> <!-- 子節點append , 是否為追加模式 . 為true則日志被追加到文件末尾 , false則清空現文件重新寫入 . 默認值true --> <append>true</append> <!-- 子節點encoder , 指定日志輸出的格式 --> <encoder> <pattern>%d{HH:mm:ss} [%thread][%X{traceId}] %-5level %logger{36} - %msg%n</pattern> </encoder> <!-- 子節點produent , 是否為安全寫入模式 . 為ture則日志會被安全的寫入文件 , 即使其他FileAppender同時做寫入操作 , 效率低 . 默認值false --> <prudent>true</prudent> </appender> <!-- RollingFileAppender , 將日志動態輸出到文件 . 通過clas指定策略 , 符合某個策略時 , 會自動創建新日志文件並輸出(按日期/大小等) . 有file/append/rollingPolicy等幾個節點 --> <appender name="log" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- RollingFileAppender詳細配置其中有file/append/pruduent幾個通用節點 , 不再詳述 .具體講一下rollingPolicy節點相關 , 該節點通過class屬性指定不同的配置指定RoolingFileAppender的動態行為 , 涉及日志文件的移動/重命名等--> <!-- TimeBasedRollingPolicy 最常用的動態策略 , 根據時間來分割日志 主要有fileNamePattern和maxHistory子節點 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 子節點fileNamePattern : 文件目錄表達式 , 包含文件名及%d轉換表達式 , %d可以包含一個SimpleDateFormat格式的日期字符串 , 如"yyyyMMdd" , 如省略直接寫%d則默認為"yyy-MM-dd", 則按照日期自動分割每天產生的日志配置該節點后 , RollingFileAppender的file節點可有可無 , 如果同時配置了兩個節點的話 , 日志文件會歸檔為兩套(一套按日期分割 , 一套整個寫入file指定的文件) --> <fileNamePattern>/data/logs/%d/xdemo_%d{yyMMdd}.log</fileNamePattern> <!-- 子節點maxHistory : 非必填節點 , 控制歷史歸檔的最大數量 , 超出該配置則刪除舊文件 . 如果配置按天歸檔且maxHistory為30 , 則只保存最近30天的日志文件(包括為該文件而創建的目錄) --> <maxHistory>30</maxHistory> <!-- 子節點totalSizeCap , 在 1.1.6版本后才開始支持, 配置總日志文件的大小上限 --> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <!-- SizeBasedTriggeringProlicy 根據大小來分割日志 , 只有一個專屬子節點maxFileSize --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <file>/data/logs/xdemo.log</file> <!-- 單個日志的大小上限 , 超出該上線則新建日志(后綴名_1/2/3)繼續寫入 --> <maxFileSize>500MB</maxFileSize> </rollingPolicy> <!-- SizeAndTimeBasedRollingPolicy 綜合時間和大小分割 , 單個時間段內超過大小繼續分割 --> <!-- ?FixedWindowRollingPolicy 根據固定窗口算法分割文件? --> <!--filter: 日志過濾器 , 可以過濾不符合規則的內容 , 使之不輸出到控制台或文件 , 為appender的子節點
logback過濾器是基於Ternary Logic, 允許多個過濾器搭配使用 , 配置多個過濾器時按照書寫順序依次執行執行一個過濾器會返回以下幾個枚舉值
ACCEPT: 該日志符合規則 , 接受處理 . 同時不會再經過其他過濾器
NEUTRAL: 當前過濾器不處理 , 下個過濾器繼續處理
DENY: 該日志將被過濾拋棄 , 且不再經過其他過濾器
LevelFilter: 級別過濾器; 過濾掉非配置等級的日志 , 只有等於當前級別時才會處理 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch><!-- 匹配等級的返回值 --> <onMismatch>DENY</onMismatch><!-- 不匹配的返回值 --> </filter> <!-- ThresholdFilter: 閥值過濾器; 過濾掉低於閥值的日志 , 當日志級別等於或高於閥值 , 過濾器返回NEUTRAL , 否則直接返回DENY --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <!-- EvaluatorFilter: 條件過濾器; 評估鑒別日志是否符合指定條件 , 有一個主要的evaluator(鑒定器)子節點 --> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <!-- 過濾器 --> <evaluator> <!-- 默認為 ch.qos.logback.classic.boolex.JaninoEventEvaluator --> <expression>return message.contains("xinfo");</expression><!-- 布爾表達式 , 還有一種正則表達式的形式 --> </evaluator> <OnMatch>ACCEPT</OnMatch> <OnMismatch>DENY</OnMismatch> </filter> </appender> <!-- logger 日志返回/級別及輸出目標配置 有必填屬性name和選填屬性level/additivity , 一個appender-ref 子節點(可配置1個或多個) name : 指定遵守該logger約束的一個包或具體的某個類 level : 日志級別 ,有以下值TRACE, DEBUG, INFO, WARN, ERROR, ALL, OFF , 不區分大小寫 additivity : 是否向上級logger傳遞日志信息 , 默認為ture . (如果上級logger也輸出日志 , 則會輸出兩份 . 所以通常情況下配置為false) --> <logger name="org.springframework" level="INFO" additivity="false"> <appender-ref ref="console"/><!-- 輸出到相關聯的appender中 --> <appender-ref ref="file"/> </logger> <!-- 更多常用的三方框架logger配置見下文 --> <!-- root本身也是一個logger節點(相當於name="root"的logger) , 但僅能配置一個 , 是所有logger的父級(可以理解為Java中的Object) , 只有一個level屬性, 默認值DEBUG --> <root level="error"> <appender-ref ref="console"/> <appender-ref ref="file" /> </root> </configuration>
<!-- 常用的三方框架logger配置 -->
<!-- myBatis/JDBC 日志 -->
<logger name="com.apache.ibatis" level="DEBUG"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- hibernate日志 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="DEBUG" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
日志輸出格式詳細說明
參數 | 說明 | 示例 |
c{length} lo{legnth} logger{length} |
輸出日志的logger , length縮短logger名 , 設置為0表示只輸入logger最右邊點符號之后內容(從右開始縮短 ,每個層級至少保留1位) |
完整logger名 : cn.xbz.test.HelloController %logger : cn.xbz.test.HelloController %logger{0}: HelloController %logger{5}: c.x.t.HelloController %logger{20}: c.x.test.HelloController |
C{length} class{length} |
輸出當前調用者的全名(包名+類名) , 參數與上面一致 , 效率不高 , 盡量避免使用 |
%class |
contextName cn |
輸出xml中配置的上下文名稱 | %contextName |
d{pattern} date{pattern} |
輸出當前的時間 , 字符串語法與SimpleDateFormat相同 | %d : 2019-01-10 10:01:10,816 %date : 2019-01-10 10:01:10,816 %date{HH:mm:ss.SSS} : 10:01:10,816 %date{yyyy-MM-dd hh:mm:ss} : 2019-01-10 10:01:10 |
F file |
輸出日志寫入目標的文件名 , 盡量避免使用 | %file |
caller{depth} caller{depth, evaluator-1, ... evaluator-n} |
當前調用者的位置信息 | ? |
L line |
輸出日期請求的行號 , 盡量避免使用 | %line |
m msg message |
輸出日志信息(必用) | %message |
M method |
當前執行日志請求的方法名 , 盡量避免使用 | %method |
n | 輸出平台相關的換行符("\n" 或 "\r\n") | %n |
p le level |
輸出日志級別(TRACE/DEBUG/INFO/WARN/ERROR/FATAL) | %level |
r relative |
輸出自程序啟動到創建日志記錄的時間 , 單位毫秒 | %relative |
t thread |
輸出調用日志的線程名 | %thread |
replace(p){r,t} | 替換輸出內容 , p為日志內容 , r是正則表達式 , 將p中符合r的內容替換為t | %replace(%msg){'\s',''} |
日志格式修飾符
可選的格式修飾符位於“%”和轉換符之間。(%-5level / %.6logger)
第一個可選修飾符是左對齊 標志,符號是減號“-”;接着是可選的最小寬度 修飾符,用十進制數表示。如果字符小於最小寬度,則左填充或右填充,默認是左填充(即右對齊),填充符為空格。如果字符大於最小寬度,字符永遠不會被截斷。最大寬度 修飾符,符號是點號"."后面加十進制數。如果字符大於最大寬度,則從前面截斷。點符號“.”后面加減號“-”在加數字,表示從尾部截斷。
例如:%-4relative 表示,將輸出從程序啟動到創建日志記錄的時間 進行左對齊 且最小寬度為4
轉載請注明出處!
參考自: https://blog.csdn.net/xingbaozhen1210/article/details/89330520