log4j

1. 描述和備註

a). 兩種配置方式,log4j.xml和log4j.properties
b). 由3個東西組成,
        "logger"--負責採集日誌,程序中使用,有繼承關係
        "appender"--負責日誌輸出到哪裏,控制檯或文件
        "layout"--定義日誌輸出的格式

1.1 Maven

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

1.2 日誌打印時組件調用順序

a). 日誌信息傳入 Logger.
b). 將日誌信息封裝成 LoggingEvent 對象並傳入 Appender.
c). 在 Appender 中調用 Filter 對日誌信息進行過濾,調用 Layout 對日誌信息進行格式化,而後輸出.
d). Logger Logger = LogManager.getLogger("categorylog");   (<category標籤的name屬性>) -->  category --> Appender

1.5 示例

public class Ts {
    // 按字符串匹配category,無則匹配到root, 支持按package層級匹配
    Logger Logger = LogManager.getLogger(Ts.class);

    @Test
    public void test() throws InterruptedException {
        while (true) {
            Logger.debug("This is debug ..");
            Logger.info("This is info ..");
            Logger.error("This is error ..\n\n");
            Thread.sleep(2000);

            // log4j.xml動態修改
            DOMConfigurator.configure(Ts.class.getResource("/log4j.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="CONSOLE" class="org.apache.log4j.ConsoleAppender">  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>  
        </layout>  
    </appender>  
  
    <appender name="FILE-DEBUG" class="org.apache.log4j.DailyRollingFileAppender">  
        <param name="DatePattern" value="'.'yyyyMMdd" />  
        <param name="Append" value="true"/>  
        <param name="Threshold" value="DEBUG"/>  
        <param name="Encoding" value="UTF-8"/>  
        <param name="file" value="./debug.log"/>  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="[%d{HH:mm:ss}] [%p] - %l - %m%n"/>  
        </layout>  
    </appender>  
    
    <!-- 支持按包過濾,也能夠直接是字符串 -->
    <category name="zhou.test">  
        <priority value="ERROR"/>  
        <appender-ref ref="CONSOLE"/>  
        <appender-ref ref="FILE-DEBUG"/>  
    </category>  
</log4j:configuration>

3. log4j.xml

3.2 Appender--日誌位置

內置 appender : 
    1).ConsoleAppender (控制檯), 
    2).FileAppender (文件), 
    3).DailyRollingFileAppender (天天產生一個日誌文件), 
    4).RollingFileAppender (文件大小到達指定尺寸的時候產生一個 新的文件) 
    5).WriterAppender (將日誌信息以流格式發送到任意指定的地方)

3.2.1 示例-天天輸出一個日誌

<appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender">  
    <param name="File" value="${jboss.server.home.dir}/log/server.log"/>  

    <!-- 設置是否在從新啓動服務時,在原有日誌的基礎添加新日誌 -->  
    <param name="Append" value="false"/>  
    <!-- Rollover at midnight each day -->  
    <param name="DatePattern" value="'.'yyyy-MM-dd"/>  
    
    <layout class="org.apache.log4j.PatternLayout">  
        <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>  
    </layout>  
</appender>

3.2.2 cmi中實際使用示例

<appender name="SYSTEM_RUN_FILE"
              class="com.huawei.mdn.cms.log.CMSAppender">
        <param name="File" value="../logs/run/CMI_system_run" />
        <param name="MaxFileSize" value="&runLogSize;" />
        <param name="MaxBackupIndex" value="20" />
        <param name="Append" value="true" />
        
        <layout class="com.huawei.mdn.cms.log.MdnSystemRunLogLayout"/>
        
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="INFO"/>
            <param name="LevelMax" value="FATAL"/>
        </filter>

    </appender>

3.2.3 filter標籤

<!--過濾器設置輸出的級別-->       
    <filter class="org.apache.log4j.varia.LevelRangeFilter">       
        <param name="levelMin" value="debug" />       
        <param name="levelMax" value="warn" />       
        <param name="AcceptOnMatch" value="true" />       
    </filter>

3.2.5 自定義Appender--如把日誌發送到flute

繼承AppenderSkeleton類-->[通常]實現Append方法便可

 

3.4. layout--日誌格式

//內置layout
    HTMLLayout(以HTML表格形式佈局),
    PatternLayout(可自定義佈局和輸出內容)-- 經常使用 
    SimpleLayout(包含日誌信息的級別和信息字符串),
    TTCCLayout(包含日誌產生的時間、線程、類別等等信息)

Log4J採用相似C的printf函數的格式化日誌,打印參數以下: -- 經常使用 「[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n」
    %p  輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
    %l  輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:com.Testlog4.main(TestLog4.java:10)
        %d  輸出日誌時間點的日期或時間,默認格式爲ISO8601,也能夠在其後指定格式,好比:%d{yyy MMM dd HH:mm:ss,SSS},輸出相似:2002年10月18日 22:10:28,921
    %n  輸出一個回車換行符,Windows平臺爲「rn」,Unix平臺爲「n」
        %m  輸出代碼中指定的消息
        
        %x   
        %t  輸出產生該日誌事件的線程名        

    %r  輸出自應用啓動到輸出該log信息耗費的毫秒數
    %c  輸出所屬的類目,一般就是所在類的全名
    %M   調用logger的方法名。

3.4.1 示例參見3.3.1節

<layout class="org.apache.log4j.PatternLayout">  
        <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>  
    </layout>  
</appender>

3.4.2 自定義layout--自定義輸出格式

繼承 TTCCLayout等內置的layout,或是layout接口-->實現format方法便可
public class MdnDebugLogLayout extends TTCCLayout
{
    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";

    public MdnDebugLogLayout()
    {
    }

    @SuppressWarnings("unchecked")
    public String format(LoggingEvent event)
    {
        LocationInfo locationInfo = event.getLocationInformation();
        String lineNumber = locationInfo.getLineNumber();
        String fileName = locationInfo.getFileName();
        String threadName = event.getThreadName();
        String message = event.getRenderedMessage();

        setDateFormat(DATE_FORMAT);
        buf.setLength(0);
        buf.append("[");
        buf.append(threadName);

        return buf.toString();
    }
}

3.5 catagory/root標籤--定義打印日誌的包

//Logger Logger = LogManager.getLogger("categorylog");   (<category標籤的name屬性>) -->  category --> Appender 
    <appender name="FILE-DEBUG" class="org.apache.log4j.DailyRollingFileAppender">  
        <param name="DatePattern" value="'.'yyyyMMdd" />  
        <param name="Append" value="true"/>  
        <param name="Threshold" value="DEBUG"/>  
        <param name="Encoding" value="UTF-8"/>  
        <param name="file" value="${profile.log.root.path}/${profile.log.name.web}/${profile.log.name.web}-debug.log"/>  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%7r] %-5p %c %M:%L - %m%n"/>  
        </layout>  
    </appender>  
  
    <!-- 日誌過濾,只打印 com.portal.controller路徑下日誌 -->
    <category name="com.portal.controller">  
        <priority value="INFO"/>  
        <appender-ref ref="CONSOLE"/>  
    </category>  
  
    <root>  
        <priority value="INFO"/>  
        <appender-ref ref="CONSOLE"/>  
        <appender-ref ref="FILE-DEBUG"/>  
    </root>  
</log4j:configuration>
相關文章
相關標籤/搜索