參考網址:java
【http://blog.csdn.net/drift_away/article/details/7403658】mysql
【http://blog.csdn.net/lxzo123/article/details/6331783】sql
【http://baike.baidu.com/view/25347.htm?fr=aladdin】數據庫
Log4j是Apache的一個開放源代碼項目,經過使用Log4j,咱們能夠控制日誌信息輸送的目的地是控制檯、文件、數據庫等目標,並且全部的這些實現均可以經過更改配置文件來實現,實際應用很是便利。最近由於工做須要,對這個類庫作了比較詳細的學習,整理資料以下:apache
1、Log4j的使用。多線程
1)、下載須要下載其官方(http://logging.apache.org/log4j/2.x/)的jar包,引入工程app
2)、置本地的log4j.properties文件。(默認讀取的是src根目錄地址,若是不在根目錄,則須要在使用前調用其設置便可)函數
PropertyConfigurator.configure( "D:/Code/conf/log4j.properties");佈局
3)、在代碼中獲取日誌,並調用其接口記錄日誌學習
1 Logger logger = Logger.getLogger(TestLog4j.class ); 2 logger.debug( " debug消息 " ); 3 logger.error( " error消息 " );
2、Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是properties格式的文件。下面咱們介紹使用properties格式作爲配置文件的方法:2、Log4j.properties配置文件介紹
1)、Log4j.properties參數比較多,不過搞清楚其規律則會很是好用,咱們首先看一個獨立的日誌配置項,而後逐一介紹其參數內容和可選項。
一個簡單的完整日誌配置
#配置根Logger log4j.rootLogger=INFO,appenderName1,appenderName2, … #配置日誌信息輸出目的地Appender 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.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.optionN = valueN |
其中appenderName能夠看成是定義了一個變量,並配置其具體參數內容。
2)、上述文件中的參數介紹以下。
一、 配置根Logger,其語法爲:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日誌記錄的優先級,分爲OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。Log4j建議只使用四個級別,優先級從高到低分別是ERROR、WARN、INFO、DEBUG。經過在這裏定義的級別,您能夠控制到應用程序中相應級別的日誌信息的開關。好比在這裏定義了INFO級別,則應用程序中全部DEBUG級別的日誌信息將不被打印出來。
appenderName就是指定日誌信息輸出到哪一個地方。您能夠同時指定多個輸出目的地。
二、 配置日誌信息輸出目的地Appender,其語法爲:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
其中,Log4j提供的appender有如下幾種:
org.apache.log4j.ConsoleAppender(控制檯),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(天天產生一個日誌文件),
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),
org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)
org.apache.log4j.lf5.LF5Appender (應用於Log Factor 5 Appender:)
org.apache.log4j.net.SMTPAppender(# 應用於發送日誌給郵件: )
org.apache.log4j.jdbc.JDBCAppender(# 應用於數據庫:)
..............................................................................................................................................
(1).ConsoleAppender選項
Threshold=WARN:指定日誌消息的輸出最低層次。
ImmediateFlush=true:默認值是true,意謂着全部的消息都會被當即輸出。
Target=System.err:默認狀況下是:System.out,指定輸出控制檯
(2).FileAppender 選項
Threshold=WARN:指定日誌消息的輸出最低層次。
ImmediateFlush=true:默認值是true,意謂着全部的消息都會被當即輸出。
File=mylog.txt:指定消息輸出到mylog.txt文件。
Append=false:默認值是true,即將消息增長到指定文件中,false指將消息覆蓋指定的文件內容。
(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: 每分鐘
(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:指定能夠產生的滾動文件的最大數。
三、配置日誌信息的佈局,其語法爲:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
其中,Log4j提供的layout有如下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式佈局),
org.apache.log4j.PatternLayout(能夠靈活地指定佈局模式),
org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串),
org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)
四、輸出格式設置 (相似C語言中的printf函數的打印格式)
在配置文件中能夠經過log4j.appender.A1.layout.ConversionPattern設置日誌輸出格式。
參數:
%p: 輸出日誌信息優先級,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也能夠在其後指定格式,好比:%d{yyy MMM dd HH:mm:ss,SSS},輸出相似:2002年10月18日 22:10:28,921
%r: 輸出自應用啓動到輸出該log信息耗費的毫秒數
%c: 輸出日誌信息所屬的類目,一般就是所在類的全名
%t: 輸出產生該日誌事件的線程名
%l: 輸出日誌事件的發生位置,至關於%C.%M(%F:%L)的組合,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10)
%x: 輸出和當前線程相關聯的NDC(嵌套診斷環境),尤爲用到像java servlets這樣的多客戶多線程的應用中。
%%: 輸出一個」%」字符
%F: 輸出日誌消息產生時所在的文件名稱
%L: 輸出代碼中的行號
%m: 輸出代碼中指定的消息,產生的日誌具體信息
%n: 輸出一個回車換行符,Windows平臺爲」\r\n」,Unix平臺爲」\n」輸出日誌信息換行
能夠在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。如:
1)%20c:指定輸出category的名稱,最小的寬度是20,若是category的名稱小於20的話,默認的狀況下右對齊。
2)%-20c:指定輸出category的名稱,最小的寬度是20,若是category的名稱小於20的話,」-」號指定左對齊。
3)%.30c:指定輸出category的名稱,最大的寬度是30,若是category的名稱大於30的話,就會將左邊多出的字符截掉,但小於30的話也不會有空格。
4)%20.30c:若是category的名稱小於20就補空格,而且右對齊,若是其名稱長於30字符,就從左邊交遠銷出的字符截掉。
****************************************************************************
下面給出一個日誌文件配置各類不一樣場景的完整demlog4j.rootLogger=DEBUG,CONSOLE,A1,im#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
log4j.addivity.org.apache=true ################### # Console Appender ################### 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
##################### # File Appender ##################### log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=file.log log4j.appender.FILE.Append=false log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
######################## # Rolling File ######################## log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log log4j.appender.ROLLING_FILE.Append=true 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 #################### # Socket Appender #################### log4j.appender.SOCKET=org.apache.log4j.net.SocketAppende 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
######################## # SMTP Appender ####################### log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.appender.MAIL.Threshold=FATAL log4j.appender.MAIL.BufferSize=10 log4j.appender.MAIL.From=chenyl@yeqiangwei.com log4j.appender.MAIL.SMTPHost=mail.hollycrm.com log4j.appender.MAIL.Subject=Log4J Message log4j.appender.MAIL.To=chenyl@yeqiangwei.com log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n ######################## # JDBC Appender ####################### log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver log4j.appender.DATABASE.user=root log4j.appender.DATABASE.password= log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=SampleMessages.log4j log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout ################### #自定義Appender ################### log4j.appender.im = net.cybercorlin.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 = corlin@yeqiangwei.com log4j.appender.im.layout=org.apache.log4j.PatternLayout log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
3、Log4j配置不一樣日誌文件目錄(不一樣數據庫相似)
一、咱們除了對不一樣級別的日誌設置不一樣輸出appender目標,在一個單個配置文件中,也可設置多個日誌文件以供不一樣場景使用。
假設咱們須要對三個不一樣場景"系統","操做","遠程訪問"分別記錄日誌。那麼可使用以下配置。
log4j.logger.log.SYSTEM_LOG=,SYSTEM_LOG log4j.logger.log.OPERATE=,OPERATE log4j.logger.log.REMOTE=,REMOTE # SYSTEM_LOG log4j.appender.SYSTEM_LOG=org.apache.log4j.RollingFileAppender log4j.appender.SYSTEM_LOG.File=E:/icloud/log/SYSTEM_LOG.log log4j.appender.SYSTEM_LOG.encoding=UTF-8 log4j.appender.SYSTEM_LOG.Threshold=all log4j.appender.SYSTEM_LOG.MaxFileSize=50MB log4j.appender.SYSTEM_LOG.MaxBackupIndex=10 log4j.appender.SYSTEM_LOG.layout=org.apache.log4j.PatternLayout log4j.appender.SYSTEM_LOG.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss} %m %n # REMOTE遠程訪問 log4j.appender.REMOTE=org.apache.log4j.RollingFileAppender log4j.appender.REMOTE.File=E:/icloud/log/REMOTE.log ...... # OPERATE 操做日誌
log4j.appender.OPERATE=org.apache.log4j.RollingFileAppender log4j.appender.OPERATE.File=E:/icloud/log/OPERATE.log ......
在Java代碼中,能夠經過傳入對應參數來得到制定的日誌類。
Logger system_log = log.getLogger("log.SYSTEM_LOG"); Logger operate = log.getLogger("log.OPERATE"); Logger remote = log.getLogger("log.REMOTE");
其中,傳入的字符串參數即爲log4j.logger.log.SYSTEM_LOG定義中的紅色部分。
若是是不一樣包結構,也可使用上述方式,不一樣的是字符串替換成包路徑。下面定義中,com.supermap.action和com.supermap.view分別表明不一樣的包。
log4j.logger.com.supermap.action=INOF,AppenderName1
log4j.logger.com.supermap.view=INOF,AppenderName2
獲取Log能夠經過直接傳入包名的方式
Logger log = log.getLogger("com.supermap.action");
也能夠經過對應包下的class,而且會經過包結構層級往上傳遞。下面二者返回統一的日誌記錄目標相同。
Logger log = log.getLogger(com.supermap.action.DrawAction.class);
Logger log = log.getLogger(com.supermap.action.util.DrawActionTool.class);
二、咱們也能夠經過編寫代碼動態配置的方式來修改LogProperties中的信息。
InputStream in = this.getClass().getClassLoader() .getResourceAsStream("com/supermap/tools/locationnormalise/log/log4j.properties"); Properties p = new Properties(); try { p.load(in); //默認日誌路徑 p.setProperty("log4j.appender.SYSTEM_LOG.File", filePath+"/SYSTEM_LOG.log"); p.setProperty("log4j.appender.OPERATE.File", filePath+"/OPERATE.log"); p.setProperty("log4j.appender.REMOTE.File", filePath+"/REMOTE.log"); PropertyConfigurator.configure(p); } catch (IOException e) { e.printStackTrace(); }
三、最後,log4j.Properties中支持對環境變量的引用,能夠經過更改環境變量來設置不一樣的日誌記錄目標
Log4j.appender.logfile.File=${WORKDIR}/logs/app.log
其中「${WORKDIR}/」是個變量,會被System Property中的「WORKDIR」的值代替。這樣,咱們就能夠在log4j加載配置文件以前,先用System.setProperty設置好根路徑。