** Log4j的配置說明與使用原則

一、Log4j簡介與配置參數說明Log4j有三個主要的組件:Loggers(記錄器),Appenders (輸出源)和Layouts(布局)。這裡可簡單理解為日誌類別,日誌要輸出的地方和日誌以何種形式輸出。綜合使用這三個組件可以輕鬆地記錄信息的類型和級別,並可以在運行時控制日誌輸出的樣式和位置。1、LoggersLoggers組件在此系統中被分為五個級別:DEBUG、INFO、WARN、ERROR和FATAL。這五個級別是有順序的,DEBUG < INFO < WARN < ERROR < FATAL,分別用來指定這條日誌信息的重要程度,明白這一點很重要,Log4j有一個規則:只輸出級別不低於設定級別的日誌信息,假設Loggers級別設定為INFO,則INFO、WARN、ERROR和FATAL級別的日誌信息都會輸出,而級別比INFO低的DEBUG則不會輸出。2、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 = classNamelog4j.appender.appenderName.Option1 = value1log4j.appender.appenderName.OptionN = valueN3、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 =classNamelog4j.appender.appenderName.layout.Option1 = value1…log4j.appender.appenderName.layout.OptionN = valueN二、配置詳解在實際應用中,要使Log4j在系統中運行須事先設定配置文件。配置文件事實上也就是對Logger、Appender及Layout進行相應設定。 Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是properties屬性文件。下面以properties屬性文件為例介紹 log4j.properties的配置。1、配置根Logger:log4j.rootLogger = [ level ] , appenderName1, appenderName2, …log4j.additivity.org.apache=false:表示Logger不會在父Logger的appender里輸出,默認為true。level :設定日誌記錄的最低級別,可設的值有OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級別,Log4j建議只使用中間四個級別。通過在這裡設定級別,您可以控制應用程序中相應級別的日誌信息的開關,比如在這裡設定了INFO級別,則應用程序中所有DEBUG級別的日誌信息將不會被列印出來。appenderName:就是指定日誌信息要輸出到哪裡。可以同時指定多個輸出目的地,用逗號隔開。例如:log4j.rootLogger=INFO,A1,B2,C32、配置日誌信息輸出目的地(appender):log4j.appender.appenderName = classNameappenderName:自定義appderName,在log4j.rootLogger設置中使用;className:可設值如下:(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:指定日誌信息的最低輸出級別,默認為DEBUG。ImmediateFlush=true:表示所有消息都會被立即輸出,設為false則不輸出,默認值是true。Target=System.err:默認值是System.out。(2)FileAppender選項:Threshold=WARN:指定日誌信息的最低輸出級別,默認為DEBUG。ImmediateFlush=true:表示所有消息都會被立即輸出,設為false則不輸出,默認值是true。Append=false:true表示消息增加到指定文件中,false則將消息覆蓋指定的文件內容,默認值是true。File=D:/logs/logging.log4j:指定消息輸出到logging.log4j文件中。(3)DailyRollingFileAppender選項:Threshold=WARN:指定日誌信息的最低輸出級別,默認為DEBUG。ImmediateFlush=true:表示所有消息都會被立即輸出,設為false則不輸出,默認值是true。Append=false:true表示消息增加到指定文件中,false則將消息覆蓋指定的文件內容,默認值是true。File=D:/logs/logging.log4j:指定當前消息輸出到logging.log4j文件中。DatePattern="."yyyy-MM:每月滾動一次日誌文件,即每月產生一個新的日誌文件。當前月的日誌文件名為logging.log4j,前一個月的日誌文件名為logging.log4j.yyyy-MM。另外,也可以指定按周、天、時、分等來滾動日誌文件,對應的格式如下: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:指定日誌信息的最低輸出級別,默認為DEBUG。ImmediateFlush=true:表示所有消息都會被立即輸出,設為false則不輸出,默認值是true。Append=false:true表示消息增加到指定文件中,false則將消息覆蓋指定的文件內容,默認值是true。File=D:/logs/logging.log4j:指定消息輸出到logging.log4j文件中。MaxFileSize=100KB:後綴可以是KB, MB 或者GB。在日誌文件到達該大小時,將會自動滾動,即將原來的內容移到logging.log4j.1文件中。MaxBackupIndex=2:指定可以產生的滾動文件的最大數,例如,設為2則可以產生logging.log4j.1,logging.log4j.2兩個滾動文件和一個logging.log4j文件。3、配置日誌信息的輸出格式(Layout):log4j.appender.appenderName.layout=classNameclassName:可設值如下:(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:輸出java文件名稱和行號,默認值是false。Title=My Logging: 默認值是Log4J Log Messages。(2)PatternLayout選項:ConversionPattern=%m%n:設定以怎樣的格式顯示消息。格式化符號說明:格式化符號說明例子%p輸出日誌信息的優先順序,即DEBUG,INFO,WARN,ERROR,FATAL。%d輸出日誌時間點的日期或時間,默認格式為ISO8601,也可以在其後指定格式如:%d{yyyy/MM/dd HH:mm:ss,SSS}%r輸出自應用程序啟動到輸出該log信息耗費的毫秒數%t輸出產生該日誌事件的線程名%l輸出日誌事件的發生位置,相當於%c.%M(%F:%L)的組合,包括類全名、方法、文件名以及在代碼中的行數例如:com.buy360.restFul.AsTest.main(AsTest.java:10)%c輸出日誌信息所屬的類目,通常就是所在類的全名com.buy360.restFul.AsTest%M輸出產生日誌信息的方法名%F輸出日誌消息產生時所在的文件名稱%L輸出代碼中的行號%m輸出代碼中指定的具體日誌信息%n輸出一個回車換行符,Windows平台為"
",Unix平台為"
"%x輸出和當前線程相關聯的NDC(嵌套診斷環境),尤其用到像java servlets這樣的多客戶多線程的應用中另外,還可以在%與格式字元之間加上修飾符來控制其最小長度、最大長度、和文本的對齊方式。如:1) c:指定輸出category的名稱,最小的長度是20,如果category的名稱長度小於20的話,默認的情況下右對齊。2)%-20c:"-"號表示左對齊。3)%.30c:指定輸出category的名稱,最大的長度是30,如果category的名稱長度大於30的話,就會將左邊多出的字元截掉,但小於30的話也不會補空格。三、如何正確地輸出日誌。1、理解正確的日誌輸出級別很多程序員都忽略了日誌輸出級別, 甚至不知道如何指定日誌的輸出級別. 相對於System.out來說, 日誌框架有兩個最大的優點就是可以指定輸出類別(category)和級別(level). 對於日誌輸出級別來說, 下面是我們應該記住的一些原則:ERROR系統發生了嚴重的錯誤, 必須馬上進行處理, 否則系統將無法繼續運行. 比如資料庫不可用等WARN系統能繼續運行, 但是必須引起關注. 對於存在的問題一般可以分為兩類: 一種系統存在明顯的問題(比如, 數據不可用), 另一種就是系統存在潛在的問題, 需要引起注意或者給出一些建議(比如, 系統運行在安全模式或者訪問當前系統的賬號存在安全隱患). 總之就是系統仍然可用, 但是最好進行檢查和調整.INFO重要的業務邏輯處理完成. 在理想情況下, INFO的日誌信息要能讓高級用戶和系統管理員理解, 並從日誌信息中能知道系統當前的運行狀態. 比如DEBUG主要用於調試、測試時使用,一般是在程序中不是非常重要的地方,這部分的日誌較多,但是在線上運行時我們一般會將日誌級別設置為INFO,避免DEBUG日誌過多影響性能.TRACE系統詳細信息, 主要給開發人員用, 一般來說, 如果是線上系統的話, 可以認為是臨時輸出, 而且隨時可以通過開關將其關閉. 有時候我們很難將DEBUG和TRACE區分開, 一般情況下, 如果是一個已經開發測試完成的系統, 再往系統中添加日誌輸出, 那麼應該設為TRACE級別2、日誌的作用:首先,它能在程序運行過程中精確的提供運行時的上下文(context)方便開發人員找到 BUG,一旦在程序中加入了Log 輸出的代碼,程序運行過程中就能自動的生成並輸出logging信息。其次,log信息可以輸出到不同的地方(控制台,文件,日誌伺服器等等)以備時候研究、統計。3、日誌的副作用:降低應用性能(日誌的輸出必然會有字元串的創建、合併,然後輸出到文件又必然會有IO的消耗,在一個100萬次的循環中,輸出日誌和不輸出日誌的性能差距甚至可以達到100倍,千倍),增加代碼的編寫量,這個大家都懂的。4、日誌輸出的原則:Log4j建議只使用四個級別,優先順序從高到低分別是 ERROR、WARN、INFO、DEBUG。通過在這裡定義的級別,您可以控制到應用程序中相應級別的日誌信息的開關。(1)、對程序的輸入輸出要以DEBUG記錄下來,常包括從文件、資料庫、網路、用戶等輸入的信息,向文件、資料庫、網路輸出的信息。(2)、對重要對象或程序狀態的修改,要以INFO記錄修改前的信息和修改後的狀態。(3)、不能忽視每個調用錯誤,異常日誌的內容要能清晰描述運行上下文,這樣有助於排查錯誤,輸出異常日誌時,第一個參數一定是一個字元串, 一般都是對問題的描述信息, 而不能是異常message(因為堆棧裡面會有), 第二個參數才是具體的異常實例. ,例如:log.error("導入數據失敗,錯誤信息為:", e);。(4)、記下列印信息時所在的文件名和函數名(必須能區分開重載函數),有行數最好。(5)、對於高並發系統,能不列印日誌就不列印日誌,輸出的日誌數量、級別、內容都要經過評估,避免日誌輸出影響性能,,可以採用初期上線時多列印一些日誌,上線運行一段時間後,通過觀察方法調用次數,響應性能來決定減少那些日誌的列印或者改變列印日誌的級別。(6)、對於異常日誌的內容要能清晰描述運行上下文,這樣有助於排查錯誤。四、使用Log4j需要注意的地方1、列印DEBUG日誌時最好加上isDebugalbe()的判斷,雖然Log4j不會輸出debug的日誌內容(日誌級別是INFO),但是調用log.debug的時候必然會傳參進去,對於參數又是字元串拼接的時候,對於方法調用次數特別大的場景下,對性能的影響是明顯的,加上isDebugalbe()的判斷,這樣做會減少欄位串的合併,理論上可以減少JVM的垃圾回收次數。2、對於日誌內容,通常應該包含當前時間、日誌級別、線程名稱、日誌描述信息,也可以包含方法名,類名,行號(但是讓log4j輸出這些信息對性能是很有影響的),所以對於要求高性能的應用最好不要輸出這些信息。五、Log4j按級別輸出日誌到不同的文件會按日存分割日誌文件,並且根據級別輸出到不同的文件log4j.rootLogger=info,stdout,info,debug,errorlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%nlog4j.logger.info=infolog4j.appender.info=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.info.layout=org.apache.log4j.PatternLayoutlog4j.appender.info.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%nlog4j.appender.info.datePattern="."yyyy-MM-ddlog4j.appender.info.Threshold = INFOlog4j.appender.info.append=truelog4j.appender.info.File=${webApp.root}/WEB-INF/logs/info.loglog4j.logger.debug=debuglog4j.appender.debug=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.debug.layout=org.apache.log4j.PatternLayoutlog4j.appender.debug.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%nlog4j.appender.debug.datePattern="."yyyy-MM-ddlog4j.appender.debug.Threshold = DEBUGlog4j.appender.debug.append=truelog4j.appender.debug.File=${webApp.root}/WEB-INF/logs/debug.loglog4j.logger.error=errorlog4j.appender.error=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.error.layout=org.apache.log4j.PatternLayoutlog4j.appender.error.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%nlog4j.appender.error.datePattern="."yyyy-MM-ddlog4j.appender.error.Threshold = ERRORlog4j.appender.error.append=truelog4j.appender.error.File=${webApp.root}/WEB-INF/logs/error.log六、在程序中使用SLF4J來隔離log4j1、SLF4J簡介SLF4J,即簡單日誌門面(Simple Logging Facade for Java),不是具體的日誌解決方案,它只服務於各種各樣的日誌系統。按照官方的說法,SLF4J是一個用於日誌系統的簡單Facade,允許最終用戶在部署其應用時使用其所希望的日誌系統。實際上,SLF4J所提供的核心API是一些介面以及一個LoggerFactory的工廠類。從某種程度上,SLF4J有點類似JDBC,不過比JDBC更簡單,在JDBC中,你需要指定驅動程序,而在使用SLF4J的時候,不需要在代碼中或配置文件中指定你打算使用那個具體的日誌系統。如同使用JDBC基本不用考慮具體資料庫一樣,SLF4J提供了統一的記錄日誌的介面,只要按照其提供的方法記錄即可,最終日誌的格式、記錄級別、輸出方式等通過具體日誌系統的配置來實現,因此可以在應用中靈活切換日誌系統。2、什麼情況可以使用如果你開發的是類庫或者嵌入式組件,那麼就應該考慮採用SLF4J,因為不可能影響最終用戶選擇哪種日誌系統。在另一方面,如果是一個簡單或者獨立的應用,確定只有一種日誌系統,那麼就沒有使用SLF4J的必要。假設你打算將你使用log4j的產品賣給要求使用JDK 1.4 Logging的用戶時,面對成千上萬的log4j調用的修改,相信這絕對不是一件輕鬆的事情。但是如果開始便使用SLF4J,那麼這種轉換將是非常輕鬆的事情。採用SLF4J可以輕鬆切換到性能更高、實現更完善的日誌組件,比如LogBack,關於LogBack的介紹與使用請參考http://www.cnblogs.com/yuanermen/archive/2012/02/13/2348942.html這篇貼子,或者官網http://logback.qos.ch/,LogBack與Log4j是同一個作者開發,可以看作是LOG4J的升級版或者改良版。3、使用SFL4J需要的配置文件和組件包,下面三個 jar 文件和一個 properties 文件都是要放在項目的 ClassPath 上A. slf4j-api-1.5.11.jarB. slf4j-log4j12-1.5.11.jarC. log4j-1.2.16.jarD. log4j.properties(也可以是 log4j.xml,本例中用 log4j.propertes)如果是Mavn工程,那麼就在POM中引入。<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.16</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.1</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.6.1</version></dependency>4、使用 SLF4J的代碼:import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class TestSlf4J {private static final Logger logger = LoggerFactory.getLogger(TestSlf4j.class);public static void main(String[] args) {logger.info("Hello {}","SLF4J"); //log4j的API是不支持這種寫法的。}}執行它,控制台輸出:2013-11-07 15:34:45,245 [com.unmi.TestSlf4j]-[INFO] Hello
推薦閱讀:

夫妻之間有這5種表現,說明已經緣盡了!
說明書 | 吃藥時遇到【慎用】【忌用】【禁用】時你傻眼了嗎?
一個女人和你睡後還有這些行為,說明她根本不愛你
當心! 十二星座這些表現說明不愛你了 超准
[童裝]寶寶毛線開襠褲的織法圖解、說明

TAG:原則 | 配置 | 說明 |