1. 程式人生 > >Java使用log4j進行日誌管理

Java使用log4j進行日誌管理

log4j是一個開源的日誌工具包,可以提供很好的日誌支援。可以通過配置檔案,定義日誌輸出的等級,日誌檔案格式,存放位置,儲存策略等。

1.引入log4j包

官網下載所需要的jar包或者原始碼包,放到工程中lib路徑下,然後在工程中新增dependency即可。

2.log4j配置檔案

log4j預設情況下會讀取classpath下的配置檔案,配置檔案格式可以為.json, .xml, .properties等。經過作者的實踐,java下的許多配置,xml檔案在閱讀性、管理上有著天然優勢,建議使用xml檔案作為配置檔案。

關於什麼是classpath,本文不做詳細闡述,不是太明白的讀者可以再查詢一下其他資料。

在Idea中,只需要在src同級目錄下,建立log4j2.xml即可,log4j會自動讀取到這個檔案。

2.1 下面我們來看看配置檔案的寫法,首先給出一個示例。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
   <!-- 變數配置 -->
   <Properties>
       <Property name="log_path">/PATH_TO_LOG/</Property>
   </Properties>

   <!-- appender配置 -->
<Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} | %5p | %c{1} | %F:%L | %m%n"/> </Console> <RollingFile name="DailyRollingFile" fileName="${log_path}/push.log" filePattern
="${log_path}/push_log_%d{yyyy-MM-dd-HH}.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} | %5p | %c{1} | %F:%L | %m%n"/> <TimeBasedTriggeringPolicy interval="5"/> <!--<SizeBasedTriggeringPolicy size="1 MB"/>--> <!--<DefaultRolloverStrategy max="200"/>--> </RollingFile> </Appenders> <Loggers> <Logger name="test" level="debug" additivity="false"> <AppenderRef ref="Console"/> </Logger> <Root level="debug"> <AppenderRef ref="Console"/> <AppenderRef ref="DailyRollingFile"/> </Root> </Loggers> </Configuration>

可以看到,配置檔案主要是Configuration下面含有的Properties, Appenders, Loggers組成。簡單來說,Appenders定義了日誌具體寫的方式(寫到什麼地方,console還是檔案;寫的格式是什麼;儲存的策略是什麼)。Loggers定義了日誌的型別,以及該型別使用什麼樣的Appender來寫日誌。Properties則主要是整個log4j的配置,最重要的是日誌檔案儲存的路徑。

2.2 示例說明

properties

在示例配置檔案中,我們在properties定義了日誌檔案儲存到/PATH_TO_LOG/路徑下。

appenders

Appenders中定義了兩種日誌的記錄方式,一種定義在Console中,命名為Console,輸出的target為SYSTEM_OUT. <Console name="Console" target="SYSTEM_OUT">。 接下來給出了單條日誌輸出的格式:<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} | %5p | %c{1} | %F:%L | %m%n"/> 含義為:開始是時間(年月日、時分秒),然後是5個字元寬度的日誌級別,然後是Logger的名稱,,其次是檔名和行數(%F:%L),最後是日誌內容(%m)+換行(%n)。

第二種appender我們定義為RollingFile,即會根據策略分檔案儲存,在其屬性中,fileName表示當前日誌輸出檔案的命名格式,filePattern表示歷史日誌存檔時命名格式。PatternLayout的作用於上述方式相同。重要的是,log4j提供了兩種日誌歸檔的策略,一種為TimeBasedTriggeringPolicy即基於時間出發的策略,其後面的屬性interval為小時數,即每隔多少小時,歸檔一次,然後新的日誌重新記錄,老日誌按照filePattern格式命名歸檔。另一種為SizeBasedTriggeringPolicy,即基於大小的策略,size可以自定義,不帶單位為Byte大小,可以設定為1 KB, 1 MB等等。當日志大小到達設定的size時,已有的日誌將會歸檔。

Loggers

loggers中定義的日誌器是程式碼中新建Logger的時候需要制定的,程式碼中每一個Logger例項都有一個logger與之對應,如果找不到對應的logger設定,則執行所有logger的父方法Root

Root是必須有的,示例中,制定了名為(nameconsoleDailyRollingFile的兩個appender來輸出Root的日誌,即此類日誌將會在控制檯中輸出,並且輸出到DailyRollingFile定義的日誌檔案中。

此外,我們還定義了一個名為test的logger,只在控制檯輸出日誌。

需要注意的是,每個logger都需要定義一個屬性level,即日誌的輸出級別。log4j中定義了6個日誌級別,等級高低為trace < debug < info < warn < error < fatallogger只會輸出大於等於level的日誌。

3.程式碼中的日誌輸出

Logger log = (Logger) LogManager.getLogger("test");//引數為logger的name
log.trace("this is a trace");
log.debug("this is a debug");
log.info("this is a info");
log.warn("this is a warn");
log.error("this is a error");
log.fatal("this is a fatal");