本篇內(nèi)容主要講解“Log4j的配置與使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Log4j的配置與使用”吧!
創(chuàng)新互聯(lián)長期為近千家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為華鎣企業(yè)提供專業(yè)的成都做網(wǎng)站、網(wǎng)站設(shè)計,華鎣網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
Log4j簡介
第1章. Log4j的優(yōu)點
Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日志信息輸送的;我們也可以控制每一條日志的輸出格式;通過定義每一條日志信息的級別,我們能夠更加細致地控制日志的生成過程。最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應(yīng)用的代碼。
log4j的好處在于:
1)通過修改配置文件,就可以決定log信息的目的地——控制臺、文件、GUI組件、甚至是套接口服務(wù)器、NT的事件記錄器、UNIX Syslog守護進程等
2)通過修改配置文件,可以定義每一條日志信息的級別,從而控制是否輸出。在系統(tǒng)開發(fā)階段可以打印詳細的log信息以跟蹤系統(tǒng)運行情況,而在系統(tǒng)穩(wěn)定后可以關(guān)閉log輸出,從而在能跟蹤系統(tǒng)運行情況的同時,又減少了垃圾代碼(System.out.println(......)等)。
3)使用log4j,需要整個系統(tǒng)有一個統(tǒng)一的log機制,有利于系統(tǒng)的規(guī)劃。
第2章.配置文件
Log4j由三個重要的組件構(gòu)成:日志信息的優(yōu)先級,日志信息的輸出目的地,日志信息的輸出格式。日志信息的優(yōu)先級從高到低有FATAL、ERROR、WARN、INFO、DEBUG,分別用來指定這條日志信息的重要程度;日志信息的輸出目的地指定了日志將打印到控制臺還是文件中;而輸出格式則控制了日志信息的顯示內(nèi)容。
2.1.日志信息的優(yōu)先級
分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。
Log4j建議只使用四個級別,優(yōu)先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,您可以控制到應(yīng)用程序中相應(yīng)級別的日志信息的開關(guān)。假如在一個級別為q的Logger中發(fā)生一個級別為p的日志請求,如果p>=q,那么請求將被啟用。這是Log4j的核心原則。比如在這里定義了INFO級別,則應(yīng)用程序中所有DEBUG級別的日志信息將不被打印出來;
2.2.輸出源的使用
有選擇的能用或者禁用日志請求僅僅是Log4j的一部分功能。Log4j允許日志請求被輸出到多個輸出源。用Log4j的話說,一個輸出源被稱做一個Appender。
Appender包括console(控制臺), files(文件), GUI components(圖形的組件), remote socket servers(socket服務(wù)), JMS(java信息服務(wù)), NT Event Loggers(NT的事件日志), and remote UNIX Syslog daemons(遠程UNIX的后臺日志服務(wù))。它也可以做到異步記錄。一個logger可以設(shè)置超過一個的appender。用addAppender方法添加一個appender到一個給定的logger。對于一個給定的logger它每個生效的日志請求都被轉(zhuǎn)發(fā)到該logger所有的appender上和該logger的父輩logger的appender上。
2.2.1. ConsoleAppender
如果使用ConsoleAppender,那么log信息將寫到Console。效果等同于直接把信息打印到System.out上了。
2.2.2. FileAppender
使用FileAppender,那么log信息將寫到指定的文件中。這應(yīng)該是比較經(jīng)常使用到的情況。相應(yīng)地,在配置文件中應(yīng)該指定log輸出的文件名。如下配置指定了log文件名為dglog.txt
log4j.appender.A2.File=dglog.txt注意將A2替換為具體配置中Appender的別名。
2.2.3. DailyRollingAppender
使用FileAppender可以將log信息輸出到文件中,但是如果文件太大了讀起來就不方便了。這時就可以使用DailyRollingAppender。DailyRollingAppender可以把Log信息輸出到按照日期來區(qū)分的文件中。配置文件就會每天產(chǎn)生一個log文件,每個log文件只記錄當天的log信息:
log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.file=dglog
log4j.appender.A2.DatePattern='.'yyyy-MM-dd
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern= %5r %-5p %c{2} - %m%n
2.2.4. org.apache.log4j.RollingFileAppender
文件大小到達指定尺寸的時候產(chǎn)生一個新的文件。
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File= ../logs/dglog.log
# Control the maximum log file size
log4j.appender.R.MaxFileSize=100KB
# Archive log files (one backup file here)
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n這個配置文件指定了輸出源R,是一個輪轉(zhuǎn)日志文件。最大的文件是100KB,當一個日志文件達到最大尺寸時,Log4J會自動把example.log重命名為dglog.log.1,然后重建一個新的dglog.log文件,依次輪轉(zhuǎn)。
2.2.5. org.apache.log4j.WriterAppender
將日志信息以流格式發(fā)送到任意指定的地方。
2.3.Layout的配置
Layout指定了log信息輸出的樣式。
2.3.1.布局樣式
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時間、線程、類別等等信息)
2.3.2.格式
%m輸出代碼中指定的消息
%p輸出優(yōu)先級,即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL
%r輸出自應(yīng)用啟動到輸出該log信息耗費的毫秒數(shù)
%c輸出所屬的類目,通常就是所在類的全名
%t輸出產(chǎn)生該日志事件的線程名
%n輸出一個回車換行符,Windows平臺為"rn",Unix平臺為"n"
%d輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%l輸出日志事件的發(fā)生位置,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main(Test Log4.java:10)
2.3.3.例子
例子1:顯示日期和log信息
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %m%n打印的信息是:
2002-11-12 11:49:42,866 SELECT * FROM Role WHERE 1=1 order by createDate desc例子2:顯示日期,log發(fā)生地方和log信息
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %l "#" %m%n
2002-11-12 11:51:46,313 cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409) "#"
SELECT * FROM Role WHERE 1=1 order by createDate desc例子3:顯示log級別,時間,調(diào)用方法,log信息
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS}
method:%l%n%m%n
log信息:
[DEBUG] 2002-11-12 12:00:57,376
method:cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409)
SELECT * FROM Role WHERE 1=1 order by createDate desc
2.4.配置文件的例子:
log4j.rootLogger=DEBUG
#將DAO層log記錄到DAOLog,allLog中
log4j.logger.DAO=DEBUG,A2,A4
#將邏輯層log記錄到BusinessLog,allLog中
log4j.logger.Businesslog=DEBUG,A3,A4
#A1--打印到屏幕上
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-5p [%t] %37c %3x - %m%n
#A2--打印到文件DAOLog中--專門為DAO層服務(wù)
log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.file=DAOLog
log4j.appender.A2.DatePattern='.'yyyy-MM-dd
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS}
method:%l%n%m%n
#A3--打印到文件BusinessLog中--專門記錄邏輯處理層服務(wù)log信息
log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A3.file=BusinessLog
log4j.appender.A3.DatePattern='.'yyyy-MM-dd
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS}
method:%l%n%m%n
#A4--打印到文件alllog中--記錄所有l(wèi)og信息
log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A4.file=alllog
log4j.appender.A4.DatePattern='.'yyyy-MM-dd
log4j.appender.A4.layout=org.apache.log4j.PatternLayout
log4j.appender.A4.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS}
method:%l%n%m%n
第3章. API使用
log4j使用步驟有3個:
3.1.初始化
3.1.1. Tomcat下的初始化
默認的Log4j initialization典型的應(yīng)用是在web-server環(huán)境下。在tomcat3.x和tomcat4.x下,你應(yīng)該將配置文件Log4j.properties放在你的web應(yīng)用程序的WEB-INF/classes目錄下。
Log4j將發(fā)現(xiàn)屬性文件,并且以此初始化。這是使它工作的最容易的方法。你也可以選擇在運行tomcat前設(shè)置系統(tǒng)屬性Log4j.configuration。對于tomcat 3.x,TOMCAT_OPTS系統(tǒng)變量是用來設(shè)置命令行的選項。對于tomcat4.0,用系統(tǒng)環(huán)境變量CATALINA_OPTS代替了TOMCAT_OPTS。
UNIX命令行
export TOMCAT_OPTS="-DLog4j.configuration=foobar.txt"告訴Log4j用文件foobar.txt作為默認的配置文件。這個文件應(yīng)該放在WEB-INF/classes目錄下。這個文件將被PropertyConfigurator所讀。每個web-application將用不同的默認配置文件,因為每個文件是和它的web-application相關(guān)的。
1. export TOMCAT_OPTS="-DLog4j.debug -DLog4j.configuration=foobar.xml" export TOMCAT_OPTS="-DLog4j.debug -DLog4j.configuration=foobar.xml"告訴Log4j輸出Log4j-internal的調(diào)試信息,并且用foobar.xml作為默認的配置文件。這個文件應(yīng)該放在你的web-application的WEB-INF/classes目錄下。因為有.xml的擴展名,它將被DOMConfigurator所讀。每個web-application將用不同的默認配置文件。因為每個文件都和它所在的web-application相關(guān)的。
2. set TOMCAT_OPTS=-DLog4j.configuration=foobar.lcf
-DLog4j.configuratorClass=com.foo.BarConfigurator告訴Log4j用文件foobar.lcf作為默認的配置文件。這個文件應(yīng)該放在你的web-application的WEB-INF/classes目錄下。因為定義了Log4j.configuratorClass系統(tǒng)屬性,文件將用自定義的com.foo.barconfigurator類來解析。每個web-application將用不同的默認配置文件。因為每個文件都和它所在的web-application相關(guān)的。
3. set TOMCAT_OPTS=-DLog4j.configuration=file:/c:/foobar.lcf set TOMCAT_OPTS=-DLog4j.configuration=file:/c:/foobar.lcf告訴Log4j用文件foobar.lcf作為默認的配置文件。這個配置文件用URL file:/c:/foobar.lcf定義了全路徑名。這樣同樣的配置文件將被所有的web-application所用。不同的web-application將通過它們自己的類裝載器來裝載Log4j。這樣,每個Log4j的環(huán)境將獨立的運作,而沒有任何的相互同步。例如:在多個web-application中定義了完全相同的輸出源的FileAppenders將嘗試寫同樣的文件。結(jié)果好象是缺乏安全性的。你必須確保每個不同的web-application的Log4j配置沒有用到同樣的系統(tǒng)資源。
3.1.2. Servlet的初始化
用一個特別的servlet來做Log4j的初始化也是可以的。如下是一個例子:
public class Log4jInit extends HttpServlet {
public void init() {
String prefix = getServletContext().getRealPath("/");
String file = getInitParameter("Log4j-init-file");
if(file != null) {
PropertyConfigurator.configure(prefix+file);
}
}
public void doGet(HttpServletRequest req, HttpServletResponse res) {
}
}在web.xml中定義隨后的servlet為你的web-application。
3.2.根據(jù)配置文件初始化log4j
log4j可以使用3中配置器來初始化:BasicConfigurator,DOMConfigurator,PropertyConfigurator其語法為:
BasicConfigurator.configure (): 自動快速地使用缺省Log4j環(huán)境。
PropertyConfigurator.configure ( String configFilename):讀取使用Java的特性文件編寫的配置文件。
DOMConfigurator.configure ( String filename ):讀取XML形式的配置文件。這里用的是PropertyConfigurator。使用PropertyConfigurator適用于所有的系統(tǒng)。如下的語句:
PropertyConfigurator.configure("log4j.properties");就以log4j.properties為配置文件初始化好了log4j環(huán)境。注意一點:這個語句只需要在系統(tǒng)啟動的時候執(zhí)行一次。例如,在ActionServlet的init()方法中調(diào)用一次。
public class ActionServlet extends HttpServlet{
...
/**
* Initialize global variables
*/
public void init() throws ServletException {
//初始化Action資源
try{
initLog4j();
...
}catch(IOException e){
throw new ServletException("Load ActionRes is Error");
}
}
...
protected void initLog4j(){
PropertyConfigurator.configure("log4j.properties");
}
...
}//end class ActionServlet
3.3.在需要使用log4j的地方獲取Logger實例
使用Log4j,首先就是獲取日志記錄器,這個記錄器將負責控制日志信息。其語法為:
public static Logger getLogger( String name),通過指定的名字獲得記錄器,如果必要的話,則為這個名字創(chuàng)建一個新的記錄器。Name一般取本類的名字,比如:
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () ) ;
Log4j使得通過軟件組件命名logger很容易。我們可以通過Logger的靜態(tài)的初始化方法在每一個類里定義一個logger,令logger的名字等于類名的全局名,而實現(xiàn)logger的命名。這是一個實效的簡單的定義一個logger的方法。因為日志輸出帶有產(chǎn)生日志的類的名字,這個命名策略使得我們更容易定位到一個日志信息的來源。雖然普通,但卻是命名logger的常用策略之一。
Log4j沒有限制定義logger的可能。開發(fā)員可以自由的按照它們的意愿定義logger的名稱。然而,以類的所在位置來命名Logger好象是目前已知的最好方法。
3.4.使用Logger對象的debug,info,fatal...方法
log.debug("it is the debug info");
第4章.優(yōu)化
一個經(jīng)常引用的依靠于logging的參數(shù)是可以計算的花費。這是一個合理的概念,一個適度的應(yīng)用程序可能產(chǎn)生成千上萬個日志請求。許多努力花在測量和調(diào)試logging的優(yōu)化上。Log4j要求快速和彈性:速度最重要,彈性是其次。
4.1.日志為禁用時,日志的優(yōu)化。
當日志被徹底的關(guān)閉,一個日志請求的花費等于一個方法的調(diào)用加上整數(shù)的比較時間。在233mhz的Pentium II機器上這個花費通常在5-50納秒之間。然而,方法調(diào)用包括參數(shù)構(gòu)建的隱藏花費。例如,對于logger cat,logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));引起了構(gòu)建信息參數(shù)的花費,例如,轉(zhuǎn)化整數(shù)i和entry[i]到一個string,并且連接中間字符串,不管信息是否被輸出。這個參數(shù)的構(gòu)建花費可能是很高,它主要決定于被調(diào)用的參數(shù)的大小。避免參數(shù)構(gòu)建的花費應(yīng)如下,
if(logger.isDebugEnabled())
{
logger.debug("result is" + result );
}
如果logger的debug被關(guān)閉這將不會招致參數(shù)構(gòu)建的花費。另一方面,如果logger是debug的話,它將產(chǎn)生兩次判斷 logger是否能用的花費。一次是在debugenabled,一次是debug。這是無關(guān)緊要的,因為判斷日志的能用 只占日志實際花費時間的約1%。在Log4j里,日志請求在Logger類的實例里。Logger是一個類,而不是一個接口。這大量的減少了在方法調(diào)用上的彈性化的花費。當然用戶采用預(yù)處理或編譯時間技術(shù)去編譯出所有的日志聲明。這將導致完美的執(zhí)行成效。然而因為二進制應(yīng)用程序不包括任何的日志聲明的結(jié)果,日志不可能對那個二進制程序開啟。以我的觀點,以這種較大的代價來換取較小的性能優(yōu)化是不值得的。
4.2.當日志狀態(tài)為啟用時,日志的優(yōu)化。
這是本質(zhì)上的優(yōu)化logger的層次。當日志狀態(tài)為開,Log4j依然需要比較請求的級別與logger的級別。然而, logger可能沒有被安排一個級別;它們將從它們的father繼承。這樣,在繼承之前,logger可能需要搜索它的ancestor。這里有一個認真的努力使層次的搜索盡可能的快。例如,子logger僅僅連接到它的存在的father logger。在先前展示的BasicConfigurator例子中,名為com.foo.bar的logger是連接到跟根logger,因此繞過了不存在的logger com和com.foo。這將顯著的改善執(zhí)行的速度,特別是解析logger的層結(jié)構(gòu)時。典型的層次結(jié)構(gòu)的解析的花費是logger徹底關(guān)閉時的三倍。
4.3.日志信息的輸出時,日志的優(yōu)化。
這是主要花費在日志輸出的格式化和發(fā)送它到它的輸出源上。這里我們再一次的付出努力以使格式化執(zhí)行的盡可能快。同appender一樣。實際上典型的花費大約是100-300毫秒。詳情看org.apache.log4.performance.Logging。雖然Log4j有許多特點,但是它的第一個設(shè)計目標還是速度。一些Log4j的組件已經(jīng)被重寫過很多次以改善性能。不過,投稿者經(jīng)常提出了新的優(yōu)化。你應(yīng)該滿意的知道,以SimpleLayout的配置執(zhí)行測試已經(jīng)展示了Log4j的輸出同System.out.println一樣快。
到此,相信大家對“Log4j的配置與使用”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!