1. 程式人生 > >Logback-將error日誌統一輸出到一個檔案配置原理

Logback-將error日誌統一輸出到一個檔案配置原理

根據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 常用配置詳解(三)