logback最實用配置與組件詳解

完整示例

首先展現一個完整的示例以供參考。java

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="10 seconds" debug="false">

    <contextName>logback</contextName>

    <timestamp key="ts" datePattern="yyyyMMdd'T'HHmmss"/>
    <property name="log.path" value="F:/logs/logback" />
    <property name="log.bak.path" value="F:/logs/logback/bak" />
    <property name="charset" value="UTF-8" />
    <property name="log.pattern.one" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
    <property name="log.pattern.two" value="[${ts}] [%5level] %logger{0} - %msg%n"/>

    <!--輸出到控制檯-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <Pattern>${log.pattern.two}</Pattern>
            <charset>${charset}</charset>
        </encoder>
    </appender>

    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/context-info.log</file>
        <append>true</append>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <Pattern>${log.pattern.one}</Pattern>
            <charset>${charset}</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.bak.path}/info/context-info-%d{yyyyMMddHHmm}-%i.zip</fileNamePattern>
            <maxHistory>10</maxHistory>
            <maxFileSize>1KB</maxFileSize>
            <totalSizeCap>1MB</totalSizeCap>
        </rollingPolicy>
    </appender>


    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/warn.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>${log.bak.path}/warn/warn-%i.zip</fileNamePattern>
            <minIndex>1</minIndex>
            <maxIndex>5</maxIndex>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>1KB</maxFileSize>
        </triggeringPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <Pattern>${log.pattern.one}</Pattern>
            <charset>${charset}</charset>
        </encoder>
    </appender>

    <appender name="ERROR" class="ch.qos.logback.core.FileAppender">
        <file>${log.path}/error.log</file>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <Pattern>${log.pattern.one}</Pattern>
            <charset>${charset}</charset>
        </encoder>
    </appender>

<!--    <logger name="org.springframework.web" level="info"/>-->
<!--    <logger name="org.curitis.test" level="info" addtivity="true">-->
<!--        <appender-ref ref="INFO"/>-->
<!--    </logger>-->

    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="INFO" />
        <appender-ref ref="WARN" />
        <appender-ref ref="ERROR" />
    </root>

</configuration>

測試代碼:web

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogTest {

    private static final Logger logger = LoggerFactory.getLogger(LogTest.class);

    public static void main(String[] args) {
        while (true) {
            logger.info("info");
            logger.warn("warn");
            logger.error("error");
        }
    }
}

日誌目錄

日誌級別

日誌級別從低到高分爲:spring

  1. TRACE
  2. DEBUG
  3. INFO
  4. WARN
  5. ERROR
  6. FATAL

configuration

scan:當此屬性設置爲true時,配置文件若是發生改變,將會被從新加載,默認值爲trueexpress

scanPeriod:設置監測配置文件是否有修改的時間間隔,若是沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。app

debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。測試

property

配置屬性,以便於在其餘配置使用,一些公用的配置例如,日誌輸出格式,日誌文件路徑等就能夠配置爲property。編碼

<timestamp key="ts" datePattern="yyyyMMdd'T'HHmmss"/>
<property name="log.path" value="F:/logs/logback/" />
<property name="log.bak.path" value="F:/logs/bak/" />
<property name="charset" value="UTF-8" />
<property name="log.pattern.one" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
<property name="log.pattern.two" value="[${ts}] [%5level] %logger{0} - %msg%n"/>

appender

我願意吧appender翻譯爲輸出器,appender主要有3中:lua

  1. ConsoleAppender
  2. RollingFileAppender
  3. FileAppender

ConsoleAppender是輸出到控制檯,RollingFileAppender是滾動日誌輸出器,通常用於輸出須要保存一段時間的日誌,FileAppender通常是數據量比較小特別關注的日誌輸出器。spa

encoder

每個appender都須要一個encoder,主要用於指定輸出日誌格式和編碼。翻譯

<encoder>
    <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</Pattern>
    <charset>UTF-8</charset>
</encoder>

過濾器(filter)

Appender能夠配置多個過濾器,過濾器主要有3中:

  1. ThresholdFilter
  2. LevelFilter
  3. EvaluatorFilter

ThresholdFilter

臨界值過濾器,Threshold是閾值,臨界值的意思,表示過濾掉低於指定臨界值的日誌。

當日志級別等於或高於臨界值時,過濾器返回NEUTRAL,當日志級別低於臨界值時,日誌會被拒絕。

例如,過濾掉全部低於INFO級別的日誌:

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">   
    <level>INFO</level>   
</filter>

過濾器,執行一個過濾器會有返回個枚舉值,即DENY,NEUTRAL,ACCEPT其中之一。返回DENY,日誌將當即被拋棄再也不通過其餘過濾器;返回NEUTRAL,有序列表裏的下個過濾器過接着處理日誌;返回ACCEPT,日誌會被當即處理,再也不通過剩餘過濾器。

過濾器被添加到<Appender> 中,爲<Appender> 添加一個或多個過濾器後,能夠用任意條件對日誌進行過濾。<Appender> 有多個過濾器時,按照配置順序執行。

LevelFilter

級別過濾器,level是級別的意思,會根據日誌級別進行過濾。

若是日誌級別等於配置級別,過濾器會根據onMath和onMismatch的配置接收或拒絕日誌,onMath和onMismatch能夠配置下面3個值:

  1. DENY:日誌將當即被拋棄再也不通過其餘過濾器
  2. NEUTRAL:下個過濾器過接着處理日誌
  3. ACCEPT:日誌會被當即處理,再也不通過剩餘過濾器
<filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>WARN</level>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
</filter>

經過LevelFilter能夠將指定級別的日誌輸出到指定文件。

EvaluatorFilter

表達式過濾器,評估、鑑別日誌是否符合指定條件。須要額外的兩個jar包:

  1. commons-compiler.jar
  2. janino.jar

表達式過濾器很強大,可是不多用,它能夠根據event、message、hrowable、logger、level、loggerContext、marker等過濾。

<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
  <evaluator>
    <expression>return message.contains("connection fail");</expression>
  </evaluator>
  <OnMatch>ACCEPT</OnMatch>
  <OnMismatch>DENY</OnMismatch>
</filter>

上面的示例是隻接收日誌中包含connection fail的日誌,還能夠根據throwable過濾出指定異常的的日誌信息,輸出到指定文件,可是通常沒有必要。

Policy

Policy主要有3個:

  1. SizeBasedTriggeringPolicy
  2. FixedWindowRollingPolicy
  3. SizeBasedTriggeringPolicy

FixedWindowRollingPolicy通常和SizeBasedTriggeringPolicy組合使用。

SizeAndTimeBasedRollingPolicy

<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/context-info.log</file>
        <append>true</append>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <Pattern>${log.pattern.one}</Pattern>
            <charset>${charset}</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.bak.path}/info/context-info-%d{yyyyMMddHHmm}-%i.zip</fileNamePattern>
            <maxHistory>10</maxHistory>
            <maxFileSize>1KB</maxFileSize>
            <totalSizeCap>1MB</totalSizeCap>
        </rollingPolicy>
    </appender>

SizeAndTimeBasedRollingPolicy須要注意的地方是fileNamePattern的配置。 既然是時間和大小,那麼就要設置時間的策略,時間策略就是根據fileNamePattern的%d{yyyyMMddHHmm}部分來的。 %d{yyyyMMddHHmm}就是每分鐘滾動一次,生成一個新的文件 %d{yyyyMMddHH}就是每一小時滾動一次,生成一個新的文件 %d{yyyyMMdd}就是天天滾動一次,生成一個新的文件

%i部分是指定大小的,由於不知道日誌有多少,因此是%i,實際上根據maxFileSize來生成,一個文件大小達到maxFileSize就生成一個新文件。

例如上面的配置就是${log.path}/context-info.log文件一分鐘內就會至少會生成一個文件,${log.bak.path}/info/context-info-201909281200-0.zip。

若是一分鐘以內context-info.log超過1kb就會生成多個。

時間大小滾動日誌

上面的maxFileSize是爲了測試設置很小,實際能夠設置大一些,例如,若是日誌要存入hdfs就能夠把maxFileSize設置爲128M,這樣恰好是一個hdfs的block。

FixedWindowRollingPolicy與SizeBasedTriggeringPolicy

<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.path}/warn.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <fileNamePattern>${log.bak.path}/warn/warn-%i.zip</fileNamePattern>
        <minIndex>1</minIndex>
        <maxIndex>5</maxIndex>
    </rollingPolicy>
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
        <maxFileSize>1KB</maxFileSize>
    </triggeringPolicy>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>WARN</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <encoder>
        <Pattern>${log.pattern.one}</Pattern>
        <charset>${charset}</charset>
    </encoder>
</appender>

固定窗口策略,最重要的配置是maxIndex,就是最大下標。結合SizeBasedTriggeringPolicy,達到指定文件大小就會生成一個新的壓縮文件。

例如,上面的配置就會最多生成5個壓縮文件,每當warn.log達到1kb的時候就會生成一個warn-i.zip的壓縮文件。

壓縮文件最多5個,會循環覆蓋。

固定窗口大小滾動日誌

logger

給指定的包或者類配置日誌輸出

<logger name="org.springframework.web" level="info"/>
<logger name="org.curitis.test" level="info" addtivity="false">
    <appender-ref ref="INFO"/>
</logger>

logger默認使用的日誌輸出地方是控制檯,能夠經過appender-ref修改。level指定輸出級別,addtivity設置爲false表示,不在其餘日誌輸出器中輸出了。

root

配置日誌輸出器

<root level="info">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="INFO" />
    <appender-ref ref="WARN" />
    <appender-ref ref="ERROR" />
</root>

level指定公共默認最低輸出級別,例如若是設置爲WARN,則低於WARN的信息都不會輸出

其餘

包含其餘配置文件,能夠是一些固定的配置,例如指定庫的日誌輸出配置文件。

<include resource="classpath:logback-base.xml" />

指定環境環境:

<springProfile name="dev">
    <logger name="org.springframework" level="WARN"/>
</springProfile>

彩色日誌: org.springframework.boot.logging.logback.ColorConverter org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter

logback文檔

相關文章
相關標籤/搜索