Log4j
0:導入jar包及log4j.properties配置文件
1:log4j 格式詳解
1.1:日誌級別
log4j.rootLogger=,
日誌級別:ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF,不區分大小寫
CONSOLE:控制檯
注意,需在控制檯輸入,只需將其中一個appender定義爲stdout即可
注意,rootLogger默認是對整個工程生效
注意,如果只想對某些包操作,那麼:log4j.logger.com.hutu=info, stdout,表示該日誌對package com.hutu生效
注意,這樣做可以區分dev/線上,也可以減小性能影響:if(log.isDebugEnabled()){log.debug();}
注意,如果末尾爲R,則以、隔開。如log4j.rootLogger=ERROR、WARN、INFO、DEBUG,R
注意,如果沒有爲R,則以,隔開。如log4j.rootLogger=ERROR,WARN,INFO,stdout
1.2:日誌輸出類型
log4j.appender.appender1 = org.apache.log4j.[控制檯|文件|每天日誌文件|按文件大小創建|...]
1.2.1:ConsoleAppender(控制檯)
Ø Threshold=WARN:指定日誌消息的輸出最低層次。
Ø ImmediateFlush=true:默認值是true,意謂着所有的消息都會被立即輸出。
Ø Target=System.err:默認情況下是:System.out,指定輸出控制檯
1.2.2:FileAppender(文件)
Ø Threshold=WARN:指定日誌消息的輸出最低層次。
Ø ImmediateFlush=true:默認值是true,意謂着所有的消息都會被立即輸出。
Ø File=mylog.txt:指定消息輸出到mylog.txt文件。
Ø Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
1.2.3:DailyRollingFileAppender(每天產生一個日誌文件)
Ø Threshold=WARN:指定日誌消息的輸出最低層次。
Ø ImmediateFlush=true:默認值是true,意謂着所有的消息都會被立即輸出。
Ø File=mylog.txt:指定消息輸出到mylog.txt文件。
Ø Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
Ø 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: 每分鐘
1.2.4:RollingFileAppender(文件大小到達指定尺寸時產生一個新的文件)
Ø Threshold=WARN:指定日誌消息的輸出最低層次。
Ø ImmediateFlush=true:默認值是true,意謂着所有的消息都會被立即輸出。
Ø File=mylog.txt:指定消息輸出到mylog.txt文件。
Ø Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
Ø MaxFileSize=100KB: 後綴可以是KB, MB 或者是 GB. 在日誌文件到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1文件。
Ø MaxBackupIndex=2:指定可以產生的滾動文件的最大數。
1.2.5:WriteAppender(將日誌信息以流格式發送到任意指定的地方)
1.2.6:JDBCAppender(將日誌信息保存到數據庫中)
配置參數詳見<使用場景 2.4>
1.2.7:JDBCAppender(將日誌發送到郵箱)
配置參數詳見<使用場景 2.3>
1.3:日誌輸出路徑
log4j.appender.appender1.File=[下列參考]
#0:絕對路徑:f:/logs/backup.log
#1:相對路徑${user.home}/logs/backup.log
#2:相對路徑:/logs/backup.log
#3:發佈到Tomcat下後的相對路徑:${catalina.home}/webapps/項目名稱/logs/backup.log,
#4:直接在tomcat/bin/startup.bat啓動,根路徑開始爲tomcat/bin目錄)
1.4:日誌佈局格式
log4j.appender.appender1.layout=org.apache.log4j.[HTMLLayout | SimpleLayout | TTCCLayout]
Ø HTMLLayout(以HTML表格形式佈局)
Ø SimpleLayout(包含日誌信息的級別和信息字符串)
Ø TTCCLayout(包含日誌產生的時間,執行緒,類別等信息)
Ø PatternLayout(可以靈活的指定佈局格式,常用)
1.5:日誌輸出格式
log4j.appender.appender1.layout.ConversionPattern=[下列參考]
例如,%d - %m%n或%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n
%c 輸出日誌信息所屬的類的全名
%d 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也可以在其後指定格式,比如:%d{yyy-M-dd HH:mm:ss },輸出類似:2002-10-18- 22:10:28
%f 輸出日誌信息所屬的類的類名
%l 輸出日誌事件的發生位置,即輸出日誌信息的語句處於它所在的類的第幾行
%m 輸出代碼中指定的信息,如log(message)中的message
%n 輸出一個回車換行符,Windows平臺爲“rn”,Unix平臺爲“n”
%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL。如果是調用debug()輸出的,則爲DEBUG,依此類推
%r 輸出自應用啓動到輸出該日誌信息所耗費的毫秒數
%t 輸出產生該日誌事件的線程名
可參考:http://blog.sina.com.cn/s/blog_4e4dd5570100qowy.html
1.6:其他配置
log4j.logger.org.springframework=OFF
log4j.logger.org.apache.struts2=OFF
log4j.logger.com.opensymphony.xwork2=OFF
log4j.rootLogger=INFO,Error,stdout #將c3p0的日誌信息關閉,但要求將所有R改爲stdout!
可參考
http://blog.csdn.net/projava/article/details/7344839
1.7:總結一下:
Logger類:完成日誌記錄,設置日誌信息級別
Appender類:決定日誌去向,終端、DB、硬盤
Layout類:決定日誌輸出的樣式,例如包含當前線程、行號、時間
2:使用場景
2.1:按日期產生日誌文件
#設置日誌的級別 ,多個以、分開(沒有給出的,則不會被輸出) log4j.rootLogger=ERROR、WARN、INFO、DEBUG,R
#DailyRollingFileAppender每天產生一個日誌文件 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
#設置日誌文件保存路徑 log4j.appender.R.File=log/backup.log
#日誌輸出格式 log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%c]-[%p] %m%n
#設置日誌文件後綴名,決定着多長時間創建一個新的文件!yyyyMMdd每天一個,yyyyMMddHH第小時一個,... log4j.appender.R.DatePattern='.'yyyy-MM-dd
#日誌佈局格式 log4j.appender.R.layout=org.apache.log4j.PatternLayout |
2.2:按文件大小產生日誌文件
#設置日誌的級別 ,多個以、分開(沒有給出的,則不會被輸出) log4j.rootLogger=ERROR、WARN、INFO、DEBUG,R
#RollingFileAppender:文件大小到達指定尺寸時產生一個新的文件 log4j.appender.R=org.apache.log4j.RollingFileAppender
#設置日誌文件保存路徑 log4j.appender.R.File=log/backup.log
#超出設置的大小,則將其以[文件名稱+序號]備份後,再寫入。 log4j.appender.R.MaxFileSize=3KB
#設置日誌文件備份的最大序號 log4j.appender.R.MaxBackupIndex=10
#日誌輸出格式 log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
#日誌佈局格式 log4j.appender.R.layout=org.apache.log4j.PatternLayout |
2.3:日誌發到郵箱
2.3.1:依賴包3個包
Ø log4j-1.2.15.jar(版本低於log4j-1.2.14.jar不支持SMTP認證)
Ø mail.jar
Ø activation.jar
2.3.2:測試環境是否能發送郵件
import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.apache.log4j.net.SMTPAppender;
public class TestLog4jSendMail { static Logger logger = Logger.getLogger(TestLog4jSendMail.class); SMTPAppender appender = new SMTPAppender(); public TestLog4jSendMail() { try { appender.setSMTPUsername("username"); appender.setSMTPPassword("password"); appender.setTo("[email protected]"); appender.setFrom("[email protected]"); // SMTP服務器 smtp.163.com appender.setSMTPHost("smtp.163.com"); appender.setLocationInfo(true); appender.setSubject("Test Mail From Log4J"); appender.setLayout(new PatternLayout()); appender.activateOptions(); logger.addAppender(appender); logger.error("Hello World"); } catch (Exception e) { e.printStackTrace(); logger.error("Printing ERROR Statements", e); } } public static void main(String args[]) { new TestLog4jSendMail(); } } |
2.3.3:配置文件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender # 日誌的錯誤級別 log4j.appender.MAIL.Threshold=ERROR,INFO,DEBUG # 緩存文件大小,日誌達到512K時發送Email #log4j.appender.MAIL.BufferSize=10 # 發送郵件的服務器(smtp.163.com) log4j.appender.MAIL.SMTPHost=smtp.163.com #郵件主題 log4j.appender.MAIL.Subject=ErrorMessage #發送郵件箱的用戶 #發送郵件箱的密碼 log4j.appender.MAIL.SMTPPassword=xxx #發送郵件箱 #接受郵件箱 log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
#在com.study.logMail包下面的ERROR級別以上的log都是採用郵件發送 log4j.logger.com.study.logMail = ERROR,MAIL |
2.3.4:反饋如下
2.4:日誌保存到數據庫
2.4.1:創建數據庫或表
CREATE DATABASE log4jdb |
CREATE TABLE RESLOG ( createTime VARCHAR(20), #日誌記錄時間 threadVARCHAR(200),#線程名稱 levelText VARCHAR(100),#日誌級別(INFO、DEBUG、ERROR等) logclass VARCHAR(1000),#發生事件的類全路徑 message VARCHAR(4000),#日誌消息 username VARCHAR(4000) #用戶 )# |
2.4.2配置參數
#設置捕獲的級別 log4j.rootLogger=ERROR、WARN、INFO、DEBUG,DATABASE #設置爲日誌保存到數據庫 log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender #這個配置是告訴LOG4J,有多少條日誌信息後才存入數 #數據庫連接字符串據庫,我這裏是1,就是說有一條就查一條,顯然這樣在生產環境下是很影響系統性能的。 log4j.appender.db.BufferSize=10 #數據庫連接字符串 log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/log4jdb #數據庫驅動,要求導入jar!!! log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver #數據庫用戶名 log4j.appender.DATABASE.user=root #數據庫密碼 log4j.appender.DATABASE.password=123456 #這個配置是告訴當LOG4J吧日誌存儲數據庫時用的SQL語句。SQ_RESLOG_LOGID.Nextval是我建的一個SEQUENCE;‘%C’是日誌中的CLASS;‘%M’是打印日誌是執行到類裏的方法;‘%d’是打印的時間,它支持格式化;‘%P’是日誌級別,包括INFO、DEBUG、ERROR等;‘%m’是MSG,日誌內容。注意這裏的參數區分大小寫。 log4j.appender.DATABASE.sql=INSERT INTO RESLOG (createTime,thread,levelText,logclass,message,username) values ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m','%X{user}') log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout |
2.4.3:結果
2.5:日誌應用於socket
log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender #設置服務端的ip log4j.appender.SOCKET.RemoteHost=localhost #設置端口號 log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true # Set up for Log Facter 5 log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread]%n%c[CATEGORY]%n%m[MESSAGE]%n%n # Log Factor 5 Appender log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 |
2.6:應用於控制檯
log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=DEBUG log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread] n%c[CATEGORY]%n%m[MESSAGE]%n%n |
2.7:應用於文件回滾
log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log //文件位置,也可以用變量${java.home}、rolling.log log4j.appender.ROLLING_FILE.Append=true //true:添加 false:覆蓋 log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文件最大尺寸 log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //備份數 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n |