Log4J的配置文件(Configuration File)就是用來設置記錄器的級別、存放器和佈局的,它可接key=value格式的設java
Log4J的配置文件(Configuration File)就是用來設置記錄器的級別、存放器和佈局的,它可接key=value格式的設置或xml格式的設置信息。經過配置,能夠建立出Log4J的運行環境。apache
1. 配置文件服務器
Log4J配置文件的基本格式以下:app
log4j.rootLogger = [ level ] , appenderName1 , appenderName2 , …函數
log4j.appender.appenderName = fully.qualified.name.of.appender.class佈局
log4j.appender.appenderName.option1 = value1
…命令行
log4j.appender.appenderName.optionN = valueN線程
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.classdebug
log4j.appender.appenderName.layout.option1 = value1調試
…
log4j.appender.appenderName.layout.optionN = valueN
其中 [level] 是日誌輸出級別,共有5級:
FATAL 0
ERROR 3
WARN 4
INFO 6
DEBUG 7
一共分爲五個級別:DEBUG、INFO、WARN、ERROR和FATAL。這五個級別是有順序的,DEBUG < INFO < WARN < ERROR < FATAL,明白這一點很重要,這裏Log4j有一個規則:假設設置了級別爲P,若是發生了一個級別Q比P高,則能夠啓動,不然屏蔽掉。
DEBUG:這個級別最低的東東,通常的來講,在系統實際運行過程當中,通常都是不輸出的。所以這個級別的信息,能夠隨意的使用,任何以爲有利於在調試時更詳細的瞭解系統運行狀態的東東,好比變量的值等等,都輸出來看看也無妨。
INFO:這個應該用來反饋系統的當前狀態給最終用戶的,因此,在這裏輸出的信息,應該對最終用戶具備實際意義,也就是最終用戶要可以看得明白是什麼意思才行。從某種角度上說,Info輸出的信息能夠看做是軟件產品的一部分(就像那些交互界面上的文字同樣),因此須要謹慎對待,不可隨便。
WARN、ERROR和FATAL:警告、錯誤、嚴重錯誤,這三者應該都在系統運行時檢測到了一個不正常的狀態,他們之間的區別,要區分還真不是那麼簡單的事情。我大體是這樣區分的:
所謂警告,應該是這個時候進行一些修復性的工做,應該還能夠把系統恢復到正常狀態中來,系統應該能夠繼續運行下去。
所謂錯誤,就是說能夠進行一些修復性的工做,但沒法肯定系統會正常的工做下去,系統在之後的某個階段,極可能會由於當前的這個問題,致使一個沒法修復的錯誤(例如宕機),但也可能一直工做到中止也不出現嚴重問題。
所謂Fatal,那就是至關嚴重的了,能夠確定這種錯誤已經沒法修復,而且若是系統繼續運行下去的話,能夠確定必然會愈來愈亂。這時候採起的最好的措施不是試圖將系統狀態恢復到正常,而是儘量地保留系統有效數據並中止運行。也就是說,選擇Warn、Error、Fatal中的具體哪個,是根據當前的這個問題對之後可能產生的影響而定的,若是對之後基本沒什麼影響,則警告之,若是確定是之後要出嚴重問題的了,則Fatal之,拿不許會怎麼樣,則Error之
Appender爲日誌輸出目的地,Log4j提供的appender有如下幾種
org.apache.log4j.ConsoleAppender(控制檯),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(天天產生一個日誌文件),
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),
org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)
Layout:日誌輸出格式,Log4j提供的layout有如下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式佈局),
org.apache.log4j.PatternLayout(能夠靈活地指定佈局模式),
org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串),
org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)
打印參數: Log4J採用相似C語言中的printf函數的打印格式格式化日誌信息,以下:
%m 輸出代碼中指定的消息
%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應用啓動到輸出該log信息耗費的毫秒數
%c 輸出所屬的類目,一般就是所在類的全名
%t 輸出產生該日誌事件的線程名
%n 輸出一個回車換行符,Windows平臺爲「\\r\\n」,Unix平臺爲「\\n」
%d 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也能夠在其後指定格式,好比:%d{yyy MMM dd HH:mm:ss , SSS},輸出相似:2022年10月01日 22 : 10 : 28 , 921
%l 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java: 10 )
2. 在代碼中初始化Logger:
1) 在程序中調用BasicConfigurator.configure()方法:給根記錄器增長一個ConsoleAppender,輸出格式經過PatternLayout設爲%-4r [%t] %-5p %c %x - %m%n,還有根記錄器的默認級別是Level.DEBUG.
2)配置放在文件裏,經過命令行參數傳遞文件名字,經過PropertyConfigurator.configure(args[x])解析並配置;
3)配置放在文件裏,經過環境變量傳遞文件名等信息,利用log4j默認的初始化過程解析並配置;
4)配置放在文件裏,經過應用服務器配置傳遞文件名等信息,利用一個特殊的servlet來完成配置
3. 爲不一樣的 Appender 設置日誌輸出級別:
當調試系統時,咱們每每注意的只是異常級別的日誌輸出,可是一般全部級別的輸出都是放在一個文件裏的,若是日誌輸出的級別是BUG!?那就慢慢去找吧。
這時咱們也許會想要是能把異常信息單獨輸出到一個文件裏該多好啊。固然能夠,Log4j已經提供了這樣的功能,咱們只須要在配置中修改Appender的Threshold 就能實現,好比下面的例子:
[配置文件]
### set log levels ###
log4j.rootLogger = debug , stdout , D , E
### 輸出到控制檯 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n、
## 輸出到日誌文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG ## 輸出DEBUG級別以上的日誌
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 保存異常信息到單獨文件 ### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = logs/error.log ## 異常日誌文件名 log4j.appender.D.Append = true log4j.appender.D.Threshold = ERROR ## 只輸出ERROR級別以上的日誌!!! log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n