使用步驟注意:html
1. 從http://logging.apache.org/log4j/1.2/ 下載文件java
2. 在src目錄下加入log4j.properties,將jar包放入build -path,log4j.properties 編譯後位於/classes目錄下。apache
3. 配置文件讀取解析:編程
PropertyConfigurator.configure(String configFilename)---->服務器
PropertyConfigurator.javaapp
staticpublic void configure(String configFilename) { new PropertyConfigurator().doConfigure(configFilename, LogManager.getLoggerRepository()); }
--->讀取配置文件socket
public void doConfigure(String configFileName, LoggerRepository hierarchy) { Properties props = new Properties(); FileInputStream istream = null; try { istream = new FileInputStream(configFileName); props.load(istream); istream.close(); } catch (Exception e) { if (e instanceof InterruptedIOException || e instanceof InterruptedException) { Thread.currentThread().interrupt(); } LogLog.error("Could not read configuration file ["+configFileName+"].", e); LogLog.error("Ignoring configuration file [" + configFileName+"]."); return; } finally { if(istream != null) { try { istream.close(); } catch(InterruptedIOException ignore) { Thread.currentThread().interrupt(); } catch(Throwable ignore) { } } } // If we reach here, then the config file is alright. doConfigure(props, hierarchy); }
-->讀取配置函數
/** Read configuration options from <code>properties</code>. See {@link #doConfigure(String, LoggerRepository)} for the expected format. */ public void doConfigure(Properties properties, LoggerRepository hierarchy) { repository = hierarchy; String value = properties.getProperty(LogLog.DEBUG_KEY); if(value == null) { value = properties.getProperty("log4j.configDebug"); if(value != null) { LogLog.warn("[log4j.configDebug] is deprecated. Use [log4j.debug] instead."); } } if(value != null) { LogLog.setInternalDebugging(OptionConverter.toBoolean(value, true)); } // // if log4j.reset=true then // reset hierarchy String reset = properties.getProperty(RESET_KEY); if (reset != null && OptionConverter.toBoolean(reset, false)) { hierarchy.resetConfiguration(); } String thresholdStr = OptionConverter.findAndSubst(THRESHOLD_PREFIX, properties); if(thresholdStr != null) { hierarchy.setThreshold(OptionConverter.toLevel(thresholdStr, Level.ALL)); LogLog.debug("Hierarchy threshold set to ["+hierarchy.getThreshold()+"]."); } configureRootCategory(properties, hierarchy); configureLoggerFactory(properties); parseCatsAndRenderers(properties, hierarchy); LogLog.debug("Finished configuring."); // We don't want to hold references to appenders preventing their // garbage collection. registry.clear(); }
原文:http://zengjinliang.iteye.com/blog/171550佈局
一:log4j配置文件基本含義說明 ui
log4j.properties配置文件講解以下: # Set root logger level to DEBUG and its only appender to A1 #log4j中有五級logger #FATAL 0 #ERROR 3 #WARN 4 #INFO 6 #DEBUG 7 配置根Logger,其語法爲: #log4j.rootLogger = [ level ] , appenderName, appenderName, … log4j.rootLogger=INFO, A1 ,R #這一句設置覺得着全部的log都輸出 #若是爲log4j.rootLogger=WARN, 則意味着只有WARN,ERROR,FATAL #被輸出,DEBUG,INFO將被屏蔽掉. # A1 is set to be a ConsoleAppender. #log4j中Appender有幾層如控制檯、文件、GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等 #ConsoleAppender輸出到控制檯 log4j.appender.A1=org.apache.log4j.ConsoleAppender # A1 使用的輸出佈局,其中log4j提供4種佈局. org.apache.log4j.HTMLLayout(以HTML表格形式佈局) #org.apache.log4j.PatternLayout(能夠靈活地指定佈局模式), #org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串), #org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息) log4j.appender.A1.layout=org.apache.log4j.PatternLayout #靈活定義輸出格式 具體查看log4j javadoc org.apache.log4j.PatternLayout #d 時間 .... log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n #R 輸出到文件 RollingFileAppender的擴展,能夠提供一種日誌的備份功能。 log4j.appender.R=org.apache.log4j.RollingFileAppender #日誌文件的名稱 log4j.appender.R.File=log4j.log #日誌文件的大小 log4j.appender.R.MaxFileSize=100KB # 保存一個備份文件 log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.TTCCLayout #log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n 配置根Logger,其語法爲: log4j.rootLogger = [ level ] , appenderName, appenderName, ... level 是日誌記錄的優先級 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(將日誌信息以流格式發送到任意指定的地方) 配置日誌信息的格式(佈局),其語法爲: 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(包含日誌產生的時間、線程、類別等等信息) -------------------------------------------------------------------------------- 2、Log4j日誌管理系統簡單使用說明 ----------------------------- 摘自:http://x.discuz.net/131976/viewspace_42754.html Log4j有三個主要的組件:Loggers,Appenders和Layouts,這裏可簡單理解爲日誌類別,日誌要輸出的地方和日誌以何種形式輸出。綜合使用這三個組件能夠輕鬆的記錄信息的類型和級別,並能夠在運行時控制日誌輸出的樣式和位置。下面對三個組件分別進行說明: 一、 Loggers Loggers組件在此係統中被分爲五個級別:DEBUG、INFO、WARN、ERROR和FATAL。這五個級別是有順序的,DEBUG < INFO < WARN < ERROR < FATAL,明白這一點很重要,這裏Log4j有一個規則:假設Loggers級別爲P,若是在Loggers中發生了一個級別Q比P高,則能夠啓動,不然屏蔽掉。 Java程序舉例來講: //創建Logger的一個實例,命名爲「com.foo」 Logger logger = Logger.getLogger("com.foo"); //設置logger的級別。一般不在程序中設置logger的級別。通常在配置文件中設置。 logger.setLevel(Level.INFO); Logger barlogger = Logger.getLogger("com.foo.Bar"); //下面這個請求可用,由於WARN >= INFO logger.warn("Low fuel level."); //下面這個請求不可用,由於DEBUG < INFO logger.debug("Starting search for nearest gas station."); //命名爲「com.foo.bar」的實例barlogger會繼承實例「com.foo」的級別。所以,下面這個請求可用,由於INFO >= INFO barlogger.info("Located nearest gas station."); //下面這個請求不可用,由於DEBUG < INFO barlogger.debug("Exiting gas station search"); 這裏「是否可用」的意思是可否輸出Logger信息。 在對Logger實例進行命名時,沒有限制,能夠取任意本身感興趣的名字。通常狀況下建議以類的所在位置來命名Logger實例,這是目前來說比較有效的Logger命名方式。這樣可使得每一個類創建本身的日誌信息,便於管理。好比: static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName()); 二、 Appenders 禁用與使用日誌請求只是Log4j其中的一個小小的地方,Log4j日誌系統容許把日誌輸出到不一樣的地方,如控制檯(Console)、文件(Files)、根據天數或者文件大小產生新的文件、以流的形式發送到其它地方等等。 其語法表示爲: 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 以上是從原理方面說明Log4j的使用方法,在具體Java編程使用Log4j能夠參照如下示例: 一、 創建Logger實例: 語法表示:public static Logger getLogger( String name) 實際使用:static Logger logger = Logger.getLogger (ServerWithLog4j.class.getName ()) ; 二、 讀取配置文件: 得到了Logger的實例以後,接下來將配置Log4j使用環境: 語法表示: 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.info("ServerSocket before accept: " + server); 在實際編程時,要使Log4j真正在系統中運行事先還要對配置文件進行定義。定義步驟就是對Logger、Appender及Layout的分別使用,具體以下: 一、 配置根Logger,其語法爲: log4j.rootLogger = [ level ] , appenderName, appenderName, … 這裏level指Logger的優先級,appenderName是日誌信息的輸出地,能夠同時指定多個輸出地。如:log4j.rootLogger= INFO,A1,A2 二、 配置日誌信息輸出目的地,其語法爲: log4j.appender.appenderName = fully.qualified.name.of.appender.class 能夠指定上面所述五個目的地中的一個。 三、 配置日誌信息的格式,其語法爲: log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 這裏上面三個步驟是對前面Log4j組件說明的一個簡化;下面給出一個具體配置例子,在程序中能夠參照執行: log4j.rootLogger=INFO,A1 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 這裏須要說明的就是日誌信息格式中幾個符號所表明的含義: -X號: X信息輸出時左對齊; %p: 日誌信息級別 %d{}: 日誌信息產生時間 %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 -------------------------------------------------------------------------------- 3、配置Log4j 摘自:http://x.discuz.net/131976/viewspace_42752.html Log4J的配置文件(Configuration File)就是用來設置記錄器的級別、存放器和佈局的,它可接key=value格式的設置或xml格式的設置信息。經過配置,能夠建立出Log4J的運行環境。 1. 配置文件 Log4J配置文件的基本格式以下: #配置根Logger log4j.rootLogger = [ level ] , 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 其中 [level] 是日誌輸出級別,共有5級: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 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},輸出相似:2002年10月18日 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 [代碼中使用] public class TestLog4j { public static void main(String[] args) { PropertyConfigurator.configure( " D:/Code/conf/log4j.properties " ); Logger logger = Logger.getLogger(TestLog4j. class ); logger.debug( " debug " ); logger.error( " error " ); } } 運行一下,看看異常信息是否是保存在了一個單獨的文件error.log中。