log4j配置總結

轉載請註明文章出處: https://tlanyan.me/log4j-conf...

log4j是阿帕奇日誌服務(Apache Logging Services)旗下的一款強大的開源日誌輸出工具。log4j使用上簡潔便利,高效且拓展性強,幾乎是Java編程的必備依賴包。除Java專用的log4j,阿帕奇日誌服務網站還有log4net、log4php等其餘編程語言對應的包。php

項目使用log4j做爲日誌組件,出於細分日誌的需求,要對配置文件作較大變更。以前對一些概念理解不是很到位,趁此機會抽空回顧官方的教程,收穫很多。因項目使用的1.2系列的jar包,本文整理自1.2版本的官方文檔。html

重要概念

先回顧log4j中的三個重要概念:logger、appender和layout。三者協力決定日誌是否應該輸出、輸出到哪裏、輸出格式是什麼。數據庫

Logger

logger是輸出日誌的對象實例。除根logger外,其他均是命名logger,一般以調用的類名爲其名字。名字中的點(.)是log4j劃分層級的依據(與包package的組織方式相同),例如名字爲com.tlanyan的logger是com.tlanyan.service的logger的父級。apache

根logger是logger中的特殊存在,緣由有三:編程

  1. 它老是存在,無需手動建立;
  2. 它的輸出等級不能爲空(null);
  3. 不能經過名字獲取其引用,只能經過Logger.getRootLogger獲取。

信息分爲六種等級:trace、debug、info、warn、error和fatal,分別對應Logger類的六個打印方法。等級之間有大小關係,trace等級最低,fatal最高。api

理解logger的層級和繼承是正確使用log4j的關鍵,即log4j不能肯定某個值時,默認會向上回溯直到找到根logger。例如根logger的appender默認老是被子logger繼承,會致使子logger中的信息屢次輸出,冗餘又低效;子級的level繼承自父級,低於父級的信息會被無心間過濾,等等。app

Appender

appender是日誌輸出的目的地,每一個appender是實現了Appender接口的類具現化實例。經常使用的appender類有:編程語言

  1. FileAppender及其子類:將日誌輸出到文件中;
  2. ConsoleAppender,將日誌輸出到標準輸出;
  3. JDBCAppender,將日誌保存到數據庫。

除了配置常規屬性值,appender中一個重要的特性是過濾器(filter)。過濾器對到達appender的信息作進一步過濾,最終肯定是否輸出。經常使用的過濾器有LevelRangeFilterStringMatchFilter函數

Layout

layout(佈局)隸屬於appender,對信息進行輸出前的格式化。例如增長打印時間,調用的文件名、線程等,或者按照xml格式輸出日誌。最經常使用的佈局是PatternLayout,可配置的成員變量是ConversionPattern,格式與C語言中的printf函數相同,具體含義請參考官方文檔。工具

配置

配置log4j的方式主要有三種:1. 經過程序代碼;2. 鍵值對形式的properties配置文件;3. xml配置文件。後二者簡單易懂,且支持修改文件後配置即時生效,建議採用。

layout在appender中配置,因此配置文件主要由兩部分組成:logger和appender。xml文件格式良好,層級關係更明顯,相對properties文件本人更偏心xml格式。下面是log4j的一個簡單xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

    <appender name="INFO" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="./logs/app-info.log"/>
        <param name="Append" value="true"/>
        <param name="MaxFileSize" value="50MB"/>
                 <param name="MaxBackupIndex" value="10"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%-5r][%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l %m%n"/>
        </layout>
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="INFO"/>
            <param name="LevelMax" value="INFO"/>
        </filter>
    </appender>

    <appender name="pay" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="./logs/pay-data.log"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%-5r][%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l %m%n"/>
        </layout>
    </appender>

    <appender name="ERROR" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="./logs/app-error.log"/>
        <param name="Append" value="true"/>
        <param name="MaxFileSize" value="50MB" />
        <param name="MaxBackupIndex" value="20" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%-5r][%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l %m%n"/>
        </layout>
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="WARN"/>
            <param name="LevelMax" value="ERROR"/>
        </filter>
    </appender>

    <logger name="com.tlanyan.pay" additivity="false">
        <level value="info"/>
        <appender-ref ref="pay"/>
    </logger>

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

</log4j:configuration>

配置文件定義了三個appender,兩個logger。注意根logger沒有名字,要用root來引用。名字爲pay的logger不繼承父級(additivity="false"),因此其中的信息不會輸出到app-info.log中。

建議在程序入口配置log4j並監聽配置文件:

DOMConfigurator.configureAndWatch("config/log4j.xml", 10000L);

經過監聽文件變化,可實現配置在修改後即時生效,無需改動代碼,也無需重啓程序。

參考

  1. http://logging.apache.org/log...
  2. http://logging.apache.org/log...
相關文章
相關標籤/搜索