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
是必須有的,示例中,制定了名為(name
)console
和DailyRollingFile
的兩個appender
來輸出Root
的日誌,即此類日誌將會在控制檯中輸出,並且輸出到DailyRollingFile
定義的日誌檔案中。
此外,我們還定義了一個名為test
的logger,只在控制檯輸出日誌。
需要注意的是,每個logger
都需要定義一個屬性level
,即日誌的輸出級別。log4j中定義了6個日誌級別,等級高低為trace < debug < info < warn < error < fatal
。logger
只會輸出大於等於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");