Logback-將error日誌統一輸出到一個檔案配置原理
阿新 • • 發佈:2019-01-09
根據Demo改編而來
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan: 當此屬性設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true。
scanPeriod: 設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒。
當scan為true時,此屬性生效。預設的時間間隔為1分鐘。
debug: 當此屬性設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="LOG_CONTEXT_NAME" value="springbootdemo"/>
<!--定義日誌檔案的儲存地址 勿在 LogBack 的配置中使用相對路徑-->
<property name="LOG_HOME" value="/tmp/logs/${LOG_CONTEXT_NAME}"/>
<!-- 定義日誌上下文的名稱 -->
<contextName> ${LOG_CONTEXT_NAME}</contextName>
<!-- 控制檯輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日誌檔案,後面的root會輸出到這裡 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日誌檔案輸出的檔名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日誌檔案保留天數-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符-->
<pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日誌檔案最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 自定義name=mylog的輸出到這裡-->
<appender name="mylog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日誌檔案輸出的檔名-->
<FileNamePattern>${LOG_HOME}/mylog.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日誌檔案保留天數-->
<MaxHistory>1</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符-->
<pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日誌檔案最大的大小 預設10MB-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>1GB</MaxFileSize>
</triggeringPolicy>
</appender>
<!--錯誤日誌統一輸出到這裡-->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日誌檔案輸出的檔名-->
<FileNamePattern>${LOG_HOME}/error.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日誌檔案保留天數-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符-->
<pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日誌檔案最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
<!-- 所有error日誌都在這裡-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 日誌輸出級別 -->
<!--TRACE\DEBUG\INFO\WARN\ERROR\FATAL\OFF-->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
<appender-ref ref="error"/>
</root>
<!--錯誤日誌會輸出一份到error中-->
<!-- additivity=true會向上傳遞給上面root再輸出一遍-->
<logger name="pubprice" level="INFO" additivity="false">
<appender-ref ref="mylog" />
<appender-ref ref="error"/>
</logger>
</configuration>
呼叫
Logger logger= LoggerFactory.getLogger(HelloController.class);
Logger myLog= LoggerFactory.getLogger("mylog");
Logger nodefine= LoggerFactory.getLogger("nodefine");
描述:所有的錯誤日誌會輸出到error.log中
nodefine日誌會輸出到TestWeb.log日誌中,因為有自定義的mylog,雖有myLog會輸出到mylog中
配置demo
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 設定日誌輸出根目錄 -->
<property name="log.dir" value="logs" />
<property name="encoding" value="UTF-8" />
<property name="pattern"
value="%d{yyyy-MM-dd.HH:mm:ss} %-5level [%thread] %logger.%M:%L %msg%n" />
<!-- 控制檯輸出日誌 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${pattern}</pattern>
</layout>
</appender>
<!-- 主日誌 -->
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>main.log</File>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<file>${log.dir}/main.log</file>
<prudent>false</prudent>
<encoder charset="UTF-8">
<pattern>${pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.dir}/main.%d{yyyy-MM-dd-HH}.log.gz</fileNamePattern>
</rollingPolicy>
</appender>
<!-- 錯誤日誌 -->
<appender name="ERROR_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>error.log</File>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<file>${log.dir}/error.log</file>
<prudent>false</prudent>
<encoder charset="UTF-8">
<pattern>${pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.dir}/error.%d{yyyy-MM-dd-HH}.log.gz</fileNamePattern>
</rollingPolicy>
</appender>
<logger name="com.qunar.fresh2017.exam1">
<level value="INFO" />
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="ERROR_FILE" />
</logger>
</configuration>
LevelFilter、ThresholdFilter和EvaluatorFilter
LevelFilter-可以只輸出某一級別日誌
LevelFilter: 級別過濾器,根據日誌級別進行過濾。如果日誌級別等於配置級別,過濾器會根據onMath 和 onMismatch接收或拒絕日誌。有以下子節點:
- :設定過濾級別
- :用於配置符合過濾條件的操作
- :用於配置不符合過濾條件的操作
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
上面的設定中只會在檔案中出現級別為INFO的日誌內容。
ThresholdFilter: 臨界值過濾器,過濾掉低於指定臨界值的日誌。當日志級別等於或高於臨界值時,過濾器返回NEUTRAL;當日志級別低於臨界值時,日誌會被拒絕。
<configuration>
<appender name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender">
<!-- 過濾掉 TRACE 和 DEBUG 級別的日誌-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger{30} - %msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
EvaluatorFilter
求值過濾器,評估、鑑別日誌是否符合指定條件。需要額外的兩個JAR包,commons-compiler.jar和janino.jar有以下子節點.
精確控制日誌的應用範圍
在程式除錯中,經常出現的情況是:錯誤只在某一個或者幾個類或者包裡,所以只需要開啟這幾個類或者包裡的DEBUG級別的log。在以前的專案,使用spring和hibernate時,一旦開啟DEBUG級別的log,程式本身的debug資訊就會被Spring和Hibernate的大量日誌淹沒,大大降低了除錯的效率。而logback讓這一切變的簡單起來了:
<logger name="org" level="ERROR" />
這一行就將org包下面的所有日誌級別設為了ERROR,不會再打擾我們的DEBUG。
參考
裡面還包含了:
- logback 常用配置詳解(序)logback 簡介
logback 常用配置詳解(一) and
logback 常用配置詳解(二)
logback 常用配置詳解(三)