Log4j高級教程,根據包輸出日誌

之前都是把全部日誌都輸出到一個文件下面,今天有個同事問想把某個包下的日誌輸出到指定的地方,因而就在網上查了一些資料,總結一下,以避免之後用到。 
真的是沒有那麼多時間來整理啊 哎,今天用到的是最下面的幾個,指定包或者類的日誌文件輸入到指定的文件,關鍵在於先前配置了rootlogger的所有配置,如何讓自定義的包或類下的日誌不受全局rootlogger管理?注意這句: html

log4j.rootLogger = DEBUG,S,E,D    #全局
log4j.logger.org.apache.axis=DEBUG,R1 #指定的 org.apache.axis包下全部的日誌
log4j.additivity.org.apache.axis=false  #不受全局管理 java


1、log4j是什麼? 
Log4j是一個開源的日誌記錄組件,其產品已經至關的成熟,且使用很是的普遍。在工程中以易用,方便等代替了 System.out 等打印語句。 
Log4j的目標是:它容許開發人員以任意的精細程度控制哪些日誌說明被輸出。經過使用外部的配置文件,能夠在運行時配置它。 
Log4j的具體在 http://logging.apache.org/log4j/找到它(有使用的文檔說明)。另外,log4j已經被轉換成 C, C++, C#, Perl, Python, Ruby, 和 Eiffel 語言。 

2、一般咱們創建一個log4j.properties文件放在src下,編譯以後就生成在../web-inf/class/固然也能夠放到其它任何目錄,只要該目錄被包含到類路徑中便可,中定位這個文件,並讀入這個文件完成的配置。這個配置文件告 訴Log4J以什麼樣的格式、把什麼樣的信息、輸出到什麼地方。 
  Log4j有三個主要的組件:Loggers(記錄器),Appenders(輸出源)和Layouts(佈局),這裏可簡單理解爲日誌類別,日誌要輸出的地方和日誌以何種形式輸出。綜合使用這三個組件能夠輕鬆的記錄信息的類型和級別,並能夠在運行時控制日誌輸出的樣式和位置。下面對三個組件分別進行說明: 
  一、 Loggers 
   Loggers組件在此係統中被分爲五個級別:DEBUG、INFO、WARN、ERROR和FATAL。這五個級別是有順序的,DEBUG Log4j有一個規則:假設Loggers級別爲P,若是在Loggers中發生了一個級別Q比P高,則能夠啓動,不然屏蔽掉。 
假設你定義的級別是info,那麼error和warn的日誌能夠顯示而比他低的debug信息就不顯示了。 
  其語法表示爲: 
  org.apache.log4j.ConsoleAppender(控制檯) 
  org.apache.log4j.FileAppender(文件) 
  org.apache.log4j.DailyRollingFileAppender(天天產生一個日誌文件) 
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件) 
  org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方) 
   
  配置時使用方式爲: 
  log4j.appender.appenderName = fully.qualified.name.of.appender.class 
  log4j.appender.appenderName.option1 = value1 
  … 
log4j.appender.appenderName.option = valueN 
  這樣就爲日誌的輸出提供了至關大的便利。 
   
  三、Layouts 
   有時用戶但願根據本身的喜愛格式化本身的日誌輸出。Log4j能夠在Appenders的後面附加Layouts來完成這個功能。Layouts提供了 四種日誌輸出樣式,如根據HTML樣式、自由指定樣式、包含日誌級別與信息的樣式和包含日誌時間、線程、類別等信息的樣式等等。 
   
  其語法表示爲: 
   
  org.apache.log4j.HTMLLayout(以HTML表格形式佈局), 
  org.apache.log4j.PatternLayout(能夠靈活地指定佈局模式), 
  org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串), 
  org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息) 
   
  配置時使用方式爲: 
   
  log4j.appender.appenderName.layout =fully.qualified.name.of.layout.class 
  log4j.appender.appenderName.layout.option1 = value1 
  … 
  log4j.appender.appenderName.layout.option = valueN 
4 . Log4j的配置   
   
  以上是從原理方面說明Log4j的使用方法,在具體Java編程使用Log4j能夠參照如下示例: 
   
  一、 創建Logger實例: 
  語法表示:public static Logger getLogger( String name) 
  實際使用:static Logger logger = Logger.getLogger(ServerWithLog4j.class.getName ()) ; 
   
  二、 讀取配置文件: 
  得到了Logger的實例以後,接下來將配置Log4j使用環境: 
  語法表示: 
或者直接放在src下把log4j.properties文件 
  BasicConfigurator.configure():自動快速地使用缺省Log4j環境。 
  PropertyConfigurator.configure(String configFilename):讀取使用Java的特性文件編寫的配置文件。 
  DOMConfigurator.configure(String filename):讀取XML形式的配置文件。 
  實際使用: 
PropertyConfigurator.configure("ServerWithLog4j.properties"); 
   
  三、 插入日誌信息 
  完成了以上連個步驟之後,下面就能夠按日誌的不一樣級別插入到你要記錄日誌的任何地方了。 
  語法表示: 
  Logger.debug(Object message);//調試信息 
  Logger.info(Object message);//通常信息 
  Logger.warn(Object message);//警告信息 
  Logger.error(Object message);//錯誤信息 
  Logger.fatal(Object message);//致命錯誤信息 
  實際使用:logger.info("ServerSocket before accept: " + server); 
   
  5. 配置過程 Log4j真正在系統中運行事先還要對配置文件進行定義。定義步驟就是對Logger、Appender及Layout的分別使用。 
Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是java properties(key=value)【Java特性文件(鍵=值)】。下面咱們介紹使用Java特性文件作爲配置文件的方法 
具體以下: 

3、配置根Logger,其語法爲: 
  log4j.rootLogger = [ level ] , appenderName1, appenderName2, … 
level : 是日誌記錄的優先級,分爲OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。Log4j建議只使用四個級別,優先級從高到低分別是ERROR、WARN、INFO、DEBUG。經過在這裏定義的級別,您能夠控制到應用程序中相應級別的日誌信息的開關。好比在這裏定 義了INFO級別,則應用程序中全部DEBUG級別的日誌信息將不被打印出來。 
   appenderName:就是指定日誌信息輸出到哪一個地方。您能夠同時指定多個輸出目的地。 
例如:log4j.rootLogger=info,A1,B2,C3 
   
  二、配置日誌信息輸出目的地,其語法爲: 
  log4j.appender.appenderName = fully.qualified.name.of.appender.class // 
   "fully.qualified.name.of.appender.class" 能夠指定下面五個目的地中的一個: 
1.org.apache.log4j.ConsoleAppender(控制檯) 
2.org.apache.log4j.FileAppender(文件) 
3.org.apache.log4j.DailyRollingFileAppender(天天產生一個日誌文件) 
4.org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件) 
5.org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方) 
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.A1=org.apache.log4j.ConsoleAppender //這裏指定了日誌輸出的第一個位置A1是控制檯ConsoleAppender 
   
  三、配置日誌信息的格式,其語法爲: 
  A. log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 
"fully.qualified.name.of.layout.class" 能夠指定下面4個格式中的一個: 
1.org.apache.log4j.HTMLLayout(以HTML表格形式佈局), 
   2.org.apache.log4j.PatternLayout(能夠靈活地指定佈局模式), 
   3.org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串), 
   4.org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息) 
1.HTMLLayout 選項 
LocationInfo=true:默認值是false,輸出java文件名稱和行號 
Title=my app file: 默認值是 Log4J Log Messages. 
2.PatternLayout 選項 
ConversionPattern=%m%n :指定怎樣格式化指定的消息。 
3.XMLLayout 選項 
LocationInfo=true:默認值是false,輸出java文件和行號 
實際應用: 
  log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
B. log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n 
這裏須要說明的就是日誌信息格式中幾個符號所表明的含義: 
   -X號: X信息輸出時左對齊; 
%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字符,就從左邊交遠銷出的字符截掉。 
  這裏上面三個步驟是對前面Log4j組件說明的一個簡化;下面給出一個具體配置例子,在程序中能夠參照執行: 
  log4j.rootLogger=INFO,A1,B2 
  log4j.appender.A1=org.apache.log4j.ConsoleAppender 
  log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
  log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n 
  根據上面的日誌格式,某一個程序的輸出結果以下: 
  0  INFO 2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014] 
16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri Jun 13 13:23:46 CST 2003' 
  16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD 
  16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.' 
  16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP 
  16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT' 
  16  DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT 

4. # 當輸出信息於回滾文件時 
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 
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 
4、具體應用文件配置舉例 
#全部包下的日誌信息都輸出到下面的日誌路徑下 
log4j.rootLogger=INFO,trycatch 

log4j.appender.trycatch=org.apache.log4j.RollingFileAppender 
log4j.appender.trycatch.File=d:/loginfo/trycatch.log 
log4j.appender.trycatch.MaxFileSize=500KB 
log4j.appender.trycatch.MaxBackupIndex=1 
log4j.appender.trycatch.layout=org.apache.log4j.PatternLayout 
log4j.appender.trycatch.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n 
#指定目錄下包下的日誌信息都存放到該目錄下 
log4j.logger.cn.com.cuigq.Theard=DEBUG,R1 

log4j.appender.R1=org.apache.log4j.RollingFileAppender 
log4j.appender.R1.File=d:/loginfo/iamSystem1.log 
log4j.appender.R1.MaxFileSize=500KB 
log4j.appender.R1.MaxBackupIndex=1 
log4j.appender.R1.layout=org.apache.log4j.PatternLayout 
log4j.appender.R1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n 

#指定目錄下的java類的日誌信息都存放到該目錄下 
log4j.logger.com.cuigq.TestError=DEBUG,R2 

log4j.appender.R2=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.R2.File=d:/loginfo/html.html 
#log4j.appender.R2.MaxFileSize=500KB 
#log4j.appender.R2.MaxBackupIndex=1 
log4j.appender.R2.layout=org.apache.log4j.HTMLLayout 
#log4j.appender.R2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n 

#指定目錄下包下的日誌信息都存放到數據庫 
log4j.logger.database=DEBUG,oracledb 

log4j.appender.oracledb=org.apache.log4j.jdbc.JDBCAppender 
log4j.appender.oracledb.Driver=oracle.jdbc.driver.OracleDriver 
log4j.appender.oracledb.URL=jdbc:oracle:thin:@192.168.20.92:1521:chshsid(切忌此處爲sid而不是數據庫名) 
log4j.appender.oracledb.user=scott 
log4j.appender.oracledb.password=tiger 
#log4j.appender.encoding=utf-8 
log4j.appender.oracledb.sql=INSERT INTO enter_ora_log4j VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m') 
log4j.appender.oracledb.layout=org.apache.log4j.PatternLayout  web

相關文章
相關標籤/搜索