Log4j使用詳解

Log4j五個級別java

ALL > DEBUG > INFO > WARN > ERROR > FATAL > OFF

1.Log4j的三大組件

•Logger:負責供客戶端代碼調用。 (執行dubug(msg),info(msg),warn(msg),error(msg)等方法)web

•Appender:負責日誌輸出。(支持多種目標輸出:控制檯,文件,Socket等)apache

•Layout:負責日誌信息格式化服務器

1.2 Logger

logger是具備層級關係的,且層級關係是由其名字來指定多線程

--如:x.y 表示兩層,x層和y層,x是y的父層級,x.y所在層級是y層級app

語法定義: |-log4j.rootLogger = [ level ] , appenderName, appenderName...webapp

|- log4j.logger.logName = [ level ] , appenderName...(配置多個logger時用)

|- ||

|- log4j.category.logName = [ level ] , appenderName...(配置多個logger時用)

|- **logger是category的子類,category如今已經不提倡使用**。

log4j.additivity.logName = boolean (默認爲true)ide

|-false : 表示當前logger不須要打到父層級所指定的appender,只打到當前的appender
1.2Appender:輸出目標

語法定義:log4j.appender.appenderName = appender類型佈局

appender類型編碼

|-這三個屬性是全部appender都具有的
|    |-Threshold=WARN      :指定日誌消息的輸出最低層次。
|    |-Encoding=utf-8	  :輸出編碼格式
|    |-ImmediateFlush=true :默認值是true,意謂着全部的消息都會被當即輸出
|
|--控制檯
|    ①org.apache.log4j.ConsoleAppender控制檯 
|          |-Target=System.out   :默認狀況下是:System.out,指定輸出控制檯   
|--文件:
|          |-File=mylog.txt:指定消息輸出到mylog.txt文件
|          |-Append=false:默認值是true,即將消息增長到指定文件中,false指將消息覆蓋指定的文件內容
|    ②org.apache.log4j.FileAppender
|    ③org.apache.log4j.DailyRollingFileAppender(天天產生一個日誌文件)
|           |-DatePattern=''.''yyyy-ww:每週滾動一次文件,即每週產生一個新的文件。
|         固然也能夠指定按月、周、天、時和分。即對應的格式以下:
|                1)'.'yyyy-MM           : 每個月 
|                2)'.'yyyy-ww           : 每週  
|                3)'.'yyyy-MM-dd        : 天天 
|                4)'.'yyyy-MM-dd-a      : 天天兩次 
|                5)'.'yyyy-MM-dd-HH     : 每小時 
|                6)'.'yyyy-MM-dd-HH-mm  : 每分鐘
|    ④org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
|            |- MaxFileSize=100KB: 後綴能夠是KB, MB 或者是 GB. 在日誌文件到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1文件。 
|            |-MaxBackupIndex=2:指定能夠產生的滾動文件的最大數。
|--流:
|    ⑤org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)
1.3Layout:輸出格式

語法定義:log4j.appender.appenderName.layout = layout類型

layout類型

|--①org.apache.log4j.HTMLLayout         (以HTML表格形式佈局),
|    |-LocationInfo=true:默認值是false,輸出java文件名稱和行號
|
|--②org.apache.log4j.PatternLayout      (經常使用:能夠靈活地指定佈局模式) 
|    |- ConversionPattern=%m%n :指定怎樣格式化指定的消息。   
|        |- -X號: X信息輸出時左對齊; 
|        |- %p: 輸出日誌信息優先級,即DEBUG,INFO,WARN,ERROR,FATAL, 例:=
|        |- %d: 輸出日誌時間點的日期或時間,默認格式爲ISO8601(2016-01-05 14:55:00,535),指定格式,:%d{yyy MMM dd HH:mm:ss,SSS},輸出相似:2002年10月18日 22:10:28,921 
|        |- %F: 輸出日誌消息產生時所在的文件名稱
|         |- %c: 輸出日誌信息的類的全名路徑,若是加上{<層數>} : %c{1}表示列出從最內層算起的指定層數的名字空間  com.apache.log4j.testLog
|        |- %m: 輸出代碼中指定的消息,產生的日誌具體信息
|         |- %n: 輸出一個回車換行符
|         |- %t: 輸出產生該日誌事件的線程名 
|         |- %M   調用logger的方法名
|         |- %l: 輸出日誌事件的發生位置,至關於%C.%M(%F:%L)的組合,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10) 
|        |- %L: 輸出代碼中的行號
|         |- %%: 輸出一個"%"字符 
|         |- %r: 輸出自應用啓動到輸出該log信息耗費的毫秒數 
|         |- %x: 輸出和當前線程相關聯的NDC(嵌套診斷環境),尤爲用到像java servlets這樣的多客戶多線程的應用中
|
|--③org.apache.log4j.SimpleLayout       (包含日誌信息的級別和信息字符串)
|
|--④org.apache.log4j.TTCCLayout         (包含日誌產生的時間、線程、類別等等信息)
1.4組件執行順序

一、日誌信息傳入 Logger。

二、將日誌信息封裝成 LoggingEvent 對象並傳入 Appender。

三、在 Appender 中調用 Filter 對日誌信息進行過濾,調用 Layout 對日誌信息進行格式化,而後輸出。

2.在java中的使用

1:獲得Logger記錄器> 這裏輸入引用文本

private static Logger = Logger.getLogger(TestAction.class);

2:讀取配置文件(可省略)

BasicConfigurator.configure (): 自動快速地使用缺省Log4j環境。

  PropertyConfigurator.configure ( String configFilename) :讀取使用Java的特性文件編寫的配置文件。

  DOMConfigurator.configure ( String filename ) :讀取XML形式的配置文件。

3:寫入log信息

logger.debug("test info");

3. 實例

3.1 log4j.Properties
log4j.logger.logger2=DEBUG, C
log4j.additivity.logger2=false

log4j.rootLogger=DEBUG, appenderName	
log4j.appender.appenderName=org.apache.log4j.DailyRollingFileAppender
log4j.appender.appenderName.DatePattern='.'yyyy-MM-dd
log4j.appender.appenderName.File=/usr/local/logs/console-appenderName.log
log4j.appender.appenderName.Append=true
log4j.appender.appenderName.Encoding=utf-8
log4j.appender.appenderName.Threshold=DEBUG
log4j.appender.appenderName.layout=org.apache.log4j.PatternLayout
log4j.appender.appenderName.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS}, [%t:%c{1}], %-5p, %m%n
3.2 log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
    <!--
       * 1. 一個appender子元素定義一個日誌輸出目的地
       * 2. 一個logger子元素定義一個日誌寫出器
    -->
    <!-- catalina.out -->
    <appender name="consoleAppend" class="org.apache.log4j.ConsoleAppender" >
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%5p][%t][%c{1}]-[%M] %m%n" />
        </layout>
    </appender>
 
    <!-- error log -->
    <appender name="errorAppend" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${webapp.root}/logs/error/error.log" />
        <param name="Append" value="true" />
        <param name="DatePattern" value="yyyy-MM-dd-HH-mm"/>
        <param name="encoding" value="utf-8"/>
        <layout class="org.apache.log4j.TTCCLayout">
        </layout>
    </appender>
 
    <!-- 消費者消費的消息記錄 -->
    <appender name="taskExcutorAppend" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="${webapp.root}/logs/excutor/excutor.log" />
        <!-- 最大文件的size,單位:Kb,Mb... -->
        <param name="MaxFileSize" value="4096" />
        <!-- 重啓了服務器以後,是否在原有文件的後面追加?true(默認):追加;false:不追加 -->
        <param name="Append" value="true"/>
        <!-- 默認 MaxBackupIndex 爲 1 -->
        <param name="MaxBackupIndex" value="10" />
        <param name="Encoding" value="utf-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%5p] %m%n" />
        </layout>
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="INFO" />
            <param name="LevelMax" value="WARN" />
        </filter>
    </appender>
 
    <!--
        logger的做用:
        1.[name屬性]:指定你定義Logger對象時候的name
        2. additivity : children-logger是否使用 rootLogger的配置,
           additivity在log4j默認爲true。這解釋了爲何有些時候,一個日誌信息在屏幕上會有屢次輸出。
        3.還能夠指定level(輸出級別)、appender-ref(指定哪一個append)
     -->
    <!-- loggers -->
    <logger name="com.raycloud.picture.task.consumer.PictureVideoTaskExcutor" additivity="true">
        <!-- 若是1個包想對應多個 Appender 就這樣,對於每一個Appender自定義的日誌級別能夠在Appender上加上filter -->
        <appender-ref ref="taskExcutorAppend" />
    </logger>
 
    <!--
        root的做用(至關於全局的意思):
        1.[priority ]:指定默認的全局輸出級別
        2.[appender-ref ]:指定一些默認的append(沒有指出特殊包或者類,即那些沒有指定<logger>元素的append)的輸出;
    -->
    <root>
        <priority value="INFO" />
        <!-- 將 logger 中 additivity=true 的日誌或者沒有指定<logger>的append輸出到控制檯 -->
        <appender-ref ref="consoleAppend" />
        <!-- 將全局的 error 日誌輸出到error文件中 -->
        <appender-ref ref="errorAppend" />
    </root>
 
</log4j:configuration>
相關文章
相關標籤/搜索