Log4j日誌配置詳解
1.log4j日誌級別
- DEBUG:輸出調試信息;指出細粒度信息事件對調試應用程序是非常有幫助的。
- INFO: 輸出提示信息;消息在粗粒度級別上突出強調應用程序的運行過程。
- WARN: 輸出警告信息;表明會出現潛在錯誤的情形。
- ERROR:輸出錯誤信息;指出雖然發生錯誤事件,但仍然不影響系統的繼續運行。
- FATAL: 輸出致命錯誤;指出每個嚴重的錯誤事件將會導致應用程序的退出。
- ALL level:打開所有日誌記錄開關;是最低等級的,用於打開所有日誌記錄。
- OFF level:關閉所有日誌記錄開關;是最高等級的,用於關閉所有日誌記錄。
按照範圍從小到大排序:OFF level > FATAL > ERROR > WARN > INFO > DEBUG > ALL level;範圍大的會包含範圍小的,例如日誌設置爲INFO級別的話則FATAL、ERROR、WARN、INFO的日誌開關都是打開的,而DEBUG的日誌開關將是關閉的。
Log4j建議只使用四個級別,優先級從高到低分別是 ERROR、WARN、INFO、DEBUG
Log4j規則:只輸出級別不低於設定級別的日誌信息,假如Loggers級別設定爲INFO,則INFO、WARN、ERROR和FATAL級別的日誌信息都會輸出,而級別比INFO低的DEBUG則不會輸出。
2.Log4j組件
- Loggers(記錄器)
- Appenders(輸出源)
- Layouts(佈局)
2.1.配置根Logger
格式:
log4j.rootLogger = [LEVEL], appenderName1, appenderName2,...
log3j.additivity.org.apache=false #表示Logger不會在父Logger的appender裏輸出,默認爲true
說明:
- LEVEL: 設定日誌記錄的最低級別,可設的值有OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義組別,Log4j建議只使用中間四個級別。
- appenderName:指定日誌信息要輸出到哪裏,可以同時指定多個輸出目的地,用逗號隔開;
例如:log4j.rootLogger=INFO,stdout, info, warn, error
2.2Appenders(輸出源)
禁用和使用日誌請求是Log4j的基本功能,Log4j日誌系統提供許多強大的功能,比如允許把日誌輸出到不同的地方,如控制檯(Console)、文件(Files)等,可以根據天數或者文件大小產生新的文件,可以以流的形式發送到其它地方等。
常用的類如下:
- org.apache.log4j.ConsoleAppender #控制檯
- org.apache.log4j.FileAppender #日誌文件
- org.apache.log4j.DailyRollingFileAppender #每天產生一個日誌文件
- org.apache.log4j.RollingFileAppender #文件大小到達指定尺寸的時候產生一個新的文件
- org.apache.log4j.WriterAppender #將日誌信息以流格式發送到任意指定的地方
- org.apache.log4j.jdbc.JDBCAppender #數據庫
- org.apache.log4j.net.JMSAppender #
- org.apache.log4j.net.SocketAppender #Socket
- org.apache.log4j.net.SMTPAppender #郵件
2.3Layouts(佈局)
有時,用戶希望根據自己的喜好格式化自己的日誌輸出,Log4j可以在Appenders的後面附加Layouts來完成這個功能。Layouts提供四種日誌輸出格式,如根據HTML樣式、自由指定樣式、包含日誌級別與信息的樣式、包含日誌時間、線程、類別等信息的樣式。
常用類如下:
- org.apache.log4j.HTMLLayout #以HTML表格表式佈局
- org.apache.log4j.PatternLayout #可以靈活批定佈局模式
- org.apache.log4j.SimpleLayout #包含日誌信息的級別和信息字符串
- org.apache.log4j.TTCCLayout #包含日誌產生的時間、線程、類別等信息
3.1爲不同的Appender設置輸出級別
在配置文件中修改Appender的Threshold來實現,例如:
##########Set Log Levels###############
log4j.rootLogger = INFO, console, info, error
######### 輸出到控制檯 ####################
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %d{ABSOLUTE}%5p%c{ 1 :%L-%m%n
######### 輸出到文件 ####################
log4j.appender.info = org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.File = ./logs/info.log
log4j.appender.info.Append = true
log4j.appender.info.Threshold = INFO ##輸出INFO級別以上的日誌
log4j.appender.info.layout = org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r]-[%p] %m%n
######### 保存異常信息到單獨文件 ####################
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.File = ./logs/error.log
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR ##只輸出ERROR級別及以上的日誌
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r]-[%p] %m%n
3.2配置日誌信息輸出目的地(appender)
語法 log4j.appender.[appenderName] = [className]
- appenderName:自定義的appenderName,在log4j.rootLogger中設置;
- className: 可設置如下值:
- org.apache.log4j.ConsoleAppender #控制檯
- org.apache.log4j.FileAppender #日誌文件
- org.apache.log4j.DailyRollingFileAppender #每天產生一個日誌文件
- org.apache.log4j.RollingFileAppender #文件大小到達指定尺寸的時候產生一個新的文件
- org.apache.log4j.WriterAppender #將日誌信息以流格式發送到任意指定的地方
- org.apache.log4j.jdbc.JDBCAppender #數據庫
- org.apache.log4j.net.JMSAppender #
- org.apache.log4j.net.SocketAppender #Socket
- org.apache.log4j.net.SMTPAppender #郵件
ConsoleAppender選項:
- Threshold = [DEBUG|INFO|WARN|ERROR|FATAL]: 指定日誌信息的最低輸出級別,默認爲DEBUG;
- ImmediateFlush = [true|false]: 表示所有消息都會被立即輸出,設爲false則不輸出,默認爲true;
- Target = [System.out|System.err]: 默認爲System.out;
FileAppender選項:
- Threshold = [DEBUG|INFO|WARN|ERROR|FATAL]: 指定日誌信息的最低輸出級別,默認爲DEBUG;
- ImmediateFlush = [true|false]: 表示所有消息都會被立即輸出,設爲false則不輸出,默認爲true;
- Append = [true|false]: true表示消息增加到指定文件中,false則將消息覆蓋指定文件內容,默認值爲true;
- File = [path/file]:指定消息輸出到目錄path文件file中;
DailyRollingFileAppender選項:
- Threshold = [DEBUG|INFO|WARN|ERROR|FATAL]: 指定日誌信息的最低輸出級別,默認爲DEBUG;
- ImmediateFlush = [true|false]: 表示所有消息都會被立即輸出,設爲false則不輸出,默認爲true;
- Append = [true|false]: true表示消息增加到指定文件中,false則將消息覆蓋指定文件內容,默認值爲true;
- File = [path/file]:指定消息輸出到目錄path文件file中;
- DataPattern =’.’yyyy-MM:每月滾動一次日誌文件,即每月產生一個新的日誌文件。當前月的日誌文件名爲file,前一個月的日誌文件名爲file.yyyy-MM,另外,可以指定按周、天、時、分等來滾動日誌文件,對應的格式如下:
- ‘.’yyyy-MM: 每月
- ‘.’yyyy-ww: 每週
- ‘.’yyyy-MM-dd:每天
- ‘.’yyyy-MM-dd-a: 每天兩次
- ‘.’yyyy-MM-dd-HH: 每小時
- ‘.’yyyy-MM-dd-HH-mm:每分鐘
RollingFileAppender選項:
- Threshold = [DEBUG|INFO|WARN|ERROR|FATAL]: 指定日誌信息的最低輸出級別,默認爲DEBUG;
- ImmediateFlush = [true|false]: 表示所有消息都會被立即輸出,設爲false則不輸出,默認爲true;
- Append = [true|false]: true表示消息增加到指定文件中,false則將消息覆蓋指定文件內容,默認值爲true;
- File = [path/file]:指定消息輸出到目錄path文件file中;
- MaxFileSize = [num][KB|MB|GB]:在日誌文件達到該大小時,將會自動滾動,即將原來的內容移到file.1文件中。
- MaxBackupIndex = [num]: 指定可以產生的滾動文件的最大數,例如,設爲2時則可以產生file.1, file.2兩個滾動文件和一個file文件;
3.3配置日誌信息的輸出格式(Layout)
語法:log4j.appender.[appenderName].layout = [className]
說明:
- className可設置如下:
- org.apache.log4j.HTMLLayout #以HTML表格表式佈局
- org.apache.log4j.PatternLayout #可以靈活批定佈局模式
- org.apache.log4j.SimpleLayout #包含日誌信息的級別和信息字符串
- org.apache.log4j.TTCCLayout #包含日誌產生的時間、線程、類別等信息
HTMLLayout選項:
- LocationInfo = [true|false]: 輸出java文件名稱和行號,默認值爲false;
- Title = My Logging: 默認值爲Log4j Log Messages
PatternLayout選項:
- ConversionPattern = [%m%n]: 設定以怎樣的格式顯示消息;其中的格式化符號有以下說明:
參數 | 說明 | 例子 | |
---|---|---|---|
%c | 列出logger名字空間的全稱,如果加上{<層數>}表示列出從最內層算起的指定層數的名字空間 | log4j配置文件參數舉例 | 輸出顯示媒介 |
假設當前logger名字空間是"a.b.c" | |||
%c | a.b.c | ||
%c{2} | b.c | ||
%20c | (若名字空間長度小於20,則左邊用空格填充) | ||
%-20c | (若名字空間長度小於20,則右邊用空格填充) | ||
%.30c | (若名字空間長度超過30,截去多餘字符) | ||
%20.30c | (若名字空間長度小於20,則左邊用空格填充;若名字空間長度超過30,截去多餘字符) | ||
%-20.30c | (若名字空間長度小於20,則右邊用空格填充;若名字空間長度超過30,截去多餘字符) | ||
%C | 列出調用logger的類的全名(包含包路徑) | 假設當前類是"org.apache.xyz.SomeClass" | |
%C | org.apache.xyz.SomeClass | ||
%C{1} | SomeClass | ||
%d | 顯示日誌記錄時間,{<日期格式>}使用ISO8601定義的日期格式 | %d{yyyy/MM/dd HH:mm:ss,SSS} | 2005/10/12 22:23:30,117 |
%d{ABSOLUTE} | 22:23:30,117 | ||
%d{DATE} | 12 Oct 2005 22:23:30,117 | ||
%d{ISO8601} | 2005-10-12 22:23:30,117 | ||
%F | 顯示調用logger的源文件名 | %F | MyClass.java |
%l | 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數 | %l | MyClass.main(MyClass.java:129) |
%L | 顯示調用logger的代碼行 | %L | 129 |
%m | 顯示輸出消息 | %m | This is a message for debug. |
%M | 顯示調用logger的方法名 | %M | main |
%n | 當前平臺下的換行符 | %n | Windows平臺下表示rn UNIX平臺下表示n |
%p | 顯示該條日誌的優先級 | %p | INFO |
%r | 顯示從程序啓動時到記錄該條日誌時已經經過的毫秒數 | %r | 1215 |
%t | 輸出產生該日誌事件的線程名 | %t | MyClass |
%x | 按NDC(Nested Diagnostic Context,線程堆棧)順序輸出日誌 | 假設某程序調用順序是MyApp調用com.foo.Bar | |
%c %x - %m%n | MyApp - Call com.foo.Bar. com.foo.Bar - Log in Bar MyApp - Return to MyApp. |
||
%X | 按MDC(Mapped Diagnostic Context,線程映射表)輸出日誌。通常用於多個客戶端連接同一臺服務器,方便服務器區分是那個客戶端訪問留下來的日誌。 | %X{5} | (記錄代號爲5的客戶端的日誌) |
%% | 顯示一個百分號 | %% | % |
4.經典Log4j配置大全
log4j.rootLogger=INFO,stdout, info, warn, error,jdbc
####################控制檯Console打印日誌##########################
log4j.logger.stdout=stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold=TRACE
log4j.appender.stdout.Encoding=UTF-8
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d(%r) -->[%t] %l: %m %x %n
####################日誌文件LogFile##########################
log4j.appender.logFile = org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold = DEBUG
log4j.appender.logFile.ImmediateFlush = true
log4j.appender.logFile.Append = true
log4j.appender.logFile.File = ./log/logfile.log
log4j.appender.logFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern = [%-5p] %d(%r) -->[%t] %l: %m %x %n
####################回滾文件RollingFile#####################
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.Threshold = DEBUG
log4j.appender.rollingFile.ImmediateFlush = true
log4j.appender.rollingFile.Append = true
log4j.appender.rollingFile.File = ./log/rollfile.log
log4j.appender.rollingFile.MaxFileSize = 200KB
log4j.appender.rollingFile.MaxBackupIndex = 50
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern = [%-5p] %d(%r) -->[%t] %l: %m %x %n
#####################定期日誌回滾dailyFile###############
#info信息
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.Threshold=INFO
log4j.appender.info.ImmediateFlush=true
log4j.appender.info.Append=true
log4j.appender.info.File=log/info.log
log4j.appender.info.DatePattern='.'yyyy-MM-dd
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d-[HL] %p %l- %m%n
#錯誤信息
log4j.logger.error=warn
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.Threshold=ERROR
log4j.appender.error.ImmediateFlush=true
log4j.appender.error.Append=true
log4j.appender.error.File=log/error.log
log4j.appender.error.DatePattern='.'yyyy-MM-dd
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d-[HL] %p %l %m%n
#警告信息
log4j.logger.warn=warn
log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.warn.Threshold=WARN
log4j.appender.warn.ImmediateFlush=true
log4j.appender.warn.Append=true
log4j.appender.warn.File=log/warn.log
log4j.appender.warn.DatePattern='.'yyyy-MM-dd
log4j.appender.warn.layout=org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=%d-[HL] %p %l- %m%n
###########################JDBC將日誌輸入到數據庫############################
log4j.appender.jdbc = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.jdbc.URL = jdbc:mysql://localhost:3306/logdb
log4j.appender.jdbc.driver = com.mysql.jdbc.Driver
log4j.appender.jdbc.user = root
log4j.appender.jdbc.password = root
log4j.appender.jdbc.sql = INSERT INTO log4j(Message) VALUES ('[%-5p] %d(%r) -->[%t] %l: %m %x %n')
log4j.appender.jdbc.layout = org.apache.log4j.PatternLayout
log4j.appender.jdbc.layout.ConversionPattern = [%-5p] %d(%r) -->[%t] %l: %m %x %n
######################應用於Socket######################
#client
log4j.appender.socket = org.apache.log4j.net.SocketAppender
log4j.appender.socket.RemoteHost = localhost
log4j.appender.socket.Port = 5001
log4j.appender.socket.LocationInfo = true
log4j.appender.socket.ReconnectionDelay = 10000
#server
log4j.rootLogger = DEBUG, socketFile
log4j.appender.socketFile = org.apache.log4j.RollingFileAppender
log4j.appender.socketFile.File = ./log/servercollected.log
log4j.appender.socketFile.MaxFileSize = 200KB
log4j.appender.socketFile.MaxBackupIndex = 50
log4j.appender.socketFile.layout = org.apache.log4j.PatternLayout
log4j.appender.socketFile.layout.ConversionPattern = [%-5p] %d(%r) -->[%t] %l: %m %x %n
#########################mail##########################
log4j.appender.mail = org.apache.log4j.net.SMTPAppender
log4j.appender.mail.Threshold = FATAL
log4j.appender.mail.BufferSize = 10
log4j.appender.mail.From = [email protected]
log4j.appender.mail.SMTPHost = mail.com
log4j.appender.mail.Subject = Log4j Message
log4j.appender.mail.To = [email protected]
log4j.appender.mail.layout = org.apache.log4j.PatternLayout
log4j.appender.mail.layout.ConversionPattern = [%-5p] %d(%r) -->[%t] %l: %m %x %n
#######################自定義Appender###############
log4j.appender.im = com.dvtn.www.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = [email protected]
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n