LogBack和Log4j都是開源日記工具庫,LogBack是Log4j的改良版本,比Log4j擁有更多的特性,同時也帶來很大性能提升。詳細數據可參照下面地址:Reasons
to prefer logback over log4j。
官網:https://logback.qos.ch/download.html
相關配置可參考:從零開始玩轉logback
第一個logback-classic包含了logback本身所需的slf4j-api.jar、logback-core.jar及logback-classsic.jar
第二個logback-ext-spring是由官方提供的對Spring的支持,它的作用就相當於log4j中的Log4jConfigListener;這個listener,網上大多都是用的自己實現的,原因在於這個插件似乎並沒有出現在官方文檔的顯要位置導致大多數人並不知道它的存在
第三個jcl-over-slf4j是用來把Spring源代碼中大量使用到的commons-logging替換成slf4j,只有在添加了這個依賴之後才能看到Spring框架本身打印的日誌,否則只能看到開發者自己打印的日誌。
打印級別:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF;
完整示例:
<?xml version="1.0" encoding="UTF-8" ?>
<!--
-scan:當此屬性設置爲true時,配置文件如果發生改變,將會被重新加載,默認值爲true
-scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。
- 當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘
-debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。
-
- configuration 子節點爲 appender、logger、root
-->
<configuration scan="true" scanPeriod="60 second" debug="false">
<!-- 負責寫日誌,控制檯日誌 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder作用:一是把日誌信息轉換成字節數組,二是把字節數組寫入到輸出流 -->
<encoder>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%5level] [%thread] %logger{0} %msg%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 文件日誌 -->
<appender name="DEBUG" class="ch.qos.logback.core.FileAppender">
<file>debug.log</file>
<!-- append: true,日誌被追加到文件結尾; false,清空現存文件;默認是true -->
<append>true</append>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- LevelFilter: 級別過濾器,根據日誌級別進行過濾 -->
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%5level] [%thread] %logger{0} %msg%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 滾動記錄文件,先將日誌記錄到指定文件,當符合某個條件時,將日誌記錄到其他文件 -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>info.log</File>
<!-- ThresholdFilter:臨界值過濾器,過濾掉 TRACE 和 DEBUG 級別的日誌 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%5level] [%thread] %logger{0} %msg%n</Pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天生成一個日誌文件,保存30天的日誌文件
- 如果隔一段時間沒有輸出日誌,前面過期的日誌不會被刪除,只有再重新打印日誌的時候,會觸發刪除過期日誌的操作。
-->
<fileNamePattern>info.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender >
<!--<!– 異常日誌輸出 –>-->
<!--<appender name="EXCEPTION" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!--<file>exception.log</file>-->
<!--<!– 求值過濾器,評估、鑑別日誌是否符合指定條件. 需要額外的兩個JAR包,commons-compiler.jar和janino.jar –>-->
<!--<filter class="ch.qos.logback.core.filter.EvaluatorFilter">-->
<!--<!– 默認爲 ch.qos.logback.classic.boolex.JaninoEventEvaluator –>-->
<!--<evaluator>-->
<!--<!– 過濾掉所有日誌消息中不包含"Exception"字符串的日誌 –>-->
<!--<expression>return message.contains("Exception");</expression>-->
<!--</evaluator>-->
<!--<OnMatch>ACCEPT</OnMatch>-->
<!--<OnMismatch>DENY</OnMismatch>-->
<!--</filter>-->
<!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
<!--<!– 觸發節點,按固定文件大小生成,超過5M,生成新的日誌文件 –>-->
<!--<maxFileSize>5MB</maxFileSize>-->
<!--</triggeringPolicy>-->
<!--</appender>-->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>error.log</file>
<encoder>
<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%5level] [%thread] %logger{0} %msg%n</Pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 按照固定窗口模式生成日誌文件,當文件大於20MB時,生成新的日誌文件。
- 窗口大小是1到3,當保存了3個歸檔文件後,將覆蓋最早的日誌。
- 可以指定文件壓縮選項
-->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>error.%d{yyyy-MM}(%i).log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 異步輸出 -->
<appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">
<!-- 不丟失日誌.默認的,如果隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日誌 -->
<discardingThreshold >0</discardingThreshold>
<!-- 更改默認的隊列的深度,該值會影響性能.默認值爲256 -->
<queueSize>512</queueSize>
<!-- 添加附加的appender,最多隻能添加一個 -->
<appender-ref ref ="ERROR"/>
</appender>
<!--
- 1.name:包名或類名,用來指定受此logger約束的某一個包或者具體的某一個類
- 2.未設置打印級別,所以繼承他的上級<root>的日誌級別“DEBUG”
- 3.未設置addtivity,默認爲true,將此logger的打印信息向上級傳遞;
- 4.未設置appender,此logger本身不打印任何信息,級別爲“DEBUG”及大於“DEBUG”的日誌信息傳遞給root,
- root接到下級傳遞的信息,交給已經配置好的名爲“STDOUT”的appender處理,“STDOUT”appender將信息打印到控制檯;
-->
<logger name="ch.qos.logback" />
<!--
- 1.將級別爲“INFO”及大於“INFO”的日誌信息交給此logger指定的名爲“STDOUT”的appender處理,在控制檯中打出日誌,
- 不再向次logger的上級 <logger name="logback"/> 傳遞打印信息
- 2.level:設置打印級別(TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF),還有一個特殊值INHERITED或者同義詞NULL,代表強制執行上級的級別。
- 如果未設置此屬性,那麼當前logger將會繼承上級的級別。
- 3.additivity:爲false,表示此logger的打印信息不再向上級傳遞,如果設置爲true,會打印兩次
- 4.appender-ref:指定了名字爲"STDOUT"的appender。
-->
<logger name="com.weizhi.common.LogMain" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
<!--<appender-ref ref="DEBUG"/>-->
<!--<appender-ref ref="EXCEPTION"/>-->
<!--<appender-ref ref="INFO"/>-->
<!--<appender-ref ref="ERROR"/>-->
<appender-ref ref="ASYNC"/>
</logger>
<!--
- 根logger
- level:設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設置爲INHERITED或者同義詞NULL。
- 默認是DEBUG。
-appender-ref:可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個logger
-->
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<!--<appender-ref ref="DEBUG"/>-->
<!--<appender-ref ref="EXCEPTION"/>-->
<!--<appender-ref ref="INFO"/>-->
<appender-ref ref="ASYNC"/>
</root>
</configuration>