使用Log4J進行日志操作
使用Log4J進行日志操作
Log4J是Apache的一個開放源代碼項目,它是一個日志操作包,通過使用Log4J,可以指定日志信息輸出的目的地,如控制臺、文件、CUI 組件、NT的事件記錄器;還可以控制每一條日志輸出格式。此外,通過定義日志信息的級別,能夠非常細致地控制日志的輸出,最令人感興趣的是,這些功能可以 通過一個配置文件來靈活進行配置,而不需要修改應程序代碼。
在應用程序中輸出日志有3個目的:
l 監視代碼中變量的變化情況,把數據周期性記錄到文件中供其他應用進行統計分析工作
l 跟蹤代碼運行時軌跡,作為日后審計的依據
l 擔當集成開發環境中的調試器的作用,向文件和控制臺打印代碼的調試信息
要在程序中輸出日志,最普通的做法就是在代碼中嵌入語句,這些打印語句可以把日志輸出到控制臺或文件中,比較好的做法就是構造一個日志操作類來封裝此類操作,而不是讓一系列的打印語句充斥代碼的主體。
在進入學習Log4J之前,我們要了解通用日志包中的兩個常用接口LogFactory和Log,下面分別介紹它們的用法。
(一)Log接口
通用日志包把日志消息分為6種級別:FATAL(致命的)、ERROR(錯誤)、WARN(警告)、INFO(信息)、DEBUG(調試)和TRACE(細節)。其中FATAL級別最高,TRACE級別最低。通用日志包采用日志級別機制,可以靈活的控制輸出的日志內容。
org.apache.commons.logging.Log接口代表日志器,它提供了一組輸出日志的方法:
l fatal(Object message): 輸出FATAL級別的日志消息。
l error(Object message): 輸出ERROR級別的日志消息。
l ……
l trace(Object message): 輸出TRACE級別的日志消息。
對于以上輸出日志的方法,只有當它輸出日志的級別大于或等于為日志其配置的日志級別時,這個方法才會被真正執行。例如,如果日志器的日志級別為WARN, 那么在程序中,它的fatal()、error()和warn()方法會被執行,而info()、debug()和trace()方法不會被執行。
Log接口還提供了一組判斷是否允許輸出特定級別的日志消息的方法:
l isFatalEnabled()
l isErrorEnabled()
l ……
l isTraceEnabled()
在程序輸出某種級別的日志消息之前,提倡先調用以上方法來判斷該級別的日志是否允許輸出,這有助于提高應用的性能。例如以下代碼先把日志消息添加到StringBuffer中,最后在調用日志器的debug()方法輸出日志:
StringBuffer buf = new StringBuffer();
buf.append(“Login Successsul - ”);
buf.append(“Name:”);
buf.append(username);
log.debug(buf.toString());
對于以上代碼,如果日志器實際上不允許輸出DEBUG級別的日志,那么執行日志器的debug()方法不會輸出任何消息,此時向 StringBuffer中添加消息的一大串操做都將是多余的。為了提高性能,可以合理的使用isDebugEnabled()方法,避免應用執行多余的 操作:
if(log.isDebugEnabled){
StringBuffer buf = newStringBuffer();
buf.append(“Login Successsul - ”);
buf.append(“Name:”);
buf.append(username);
log.debug(bug.toString());
}
(二)LogFactory接口
org.apache.commons.logging.LogFactory接口提供了獲得日志器實例的兩個靜態方法:
public static LoggetLog(String name)throws LogConfigurationException;
public static LoggetLog(Class class) throws LogConfigurationException;
第一個getLog()方法以name參數作為日志器的名字;第二個getLog()方法以class參數指定的類的名字作為日志器的名字,以下是第二個getLog()方法的一種實現方式:
public static Log getLog(Class class) throwsLogConfigurationException{
getLog(class.getName); //call getLog(String name)
}
Log4J簡介
在強調可重用組件的今天,除了自己從頭到尾開發一個可重用的日志操作類名,Apache為我們提供了一個強有力的現成的日志操作包Log4J。
Log4J主要由三大組件構成:
l Logger:負責生成日志,并能夠對日志信息進行分類篩選,通俗地講就是決定什么日志信息應該輸出,什么日志信息應該被忽略
l Appender:定義了日志信息輸出的目的地,指定日志信息應該被輸出到什么地方,這些地方可以是控制臺、文件、網絡設備等
l Layout: 指定日志信息的輸出格式
這個3個組件協同工作,使得開發者能夠依據日志信息類別記錄信息,并能夠在程序運行期間,控制日志信息的輸出格式以及日志存放地點。
一個Logger可以有多個Appender,這意味著日志信息可以同時輸出到多個設備上,每個Appender都對應一種Layout,Layout決定了輸出日志信息的格式。
假定根據實際需要,要求程序中的日志信息既能輸出到程序運行的控制臺下,又能輸出到指定的文件中,并且當日志信息輸出到控制臺時 SimplLayout布局,當日志信息輸出到文件時PatternLayout布局,此時Logger、Appender和Layout3個組件的關系 如圖
Appender組件
Log4J的Appender組件決定將日志信息輸出到什么地方。日前Log4J的Appender支持將日志信息輸出到以下的目的:
l 控制臺(Console)
l 文件
l GUI組件
一個logger可以同時對應多個Appender,也就是說,一個Logger的日志信息可以同時輸出到多個目的地,例如:要為rootLogger配置兩個Appender; 一個是file,一個是console,則可以采用如下配置代碼:
log4j.rootLogger =WARN.file.console log4j.appender.file=org.apache.log4jRollingFileAppender log4j.appender.console=org.apache.log4j.ConsoleAppender |
Layout組件
Layout組件用來決定日志的輸出格式,它有以下幾種類型
l org.apache.log4j.HTMLLayout(以HTML表格形式布局)
l org.apache.log4j.PatternLayout(可以靈活地指定布局模式)
l org.apache.log4j.SimpleLayout(包含日志信息級別和信息字符串)
l org.apache.log4j.TTCCLayout(包含日志產生的時間、線程和類別等信息)
Log4J的基本使用方法
在應用程序中使用Log4J,首先在一個配置文件中配置Log4j的各個組件,然后就可以在程序中通過Log4JAPI來操作日志
定義配置文件
Log4J由3個重要的組件構成:Logger、Appender和layout。Log4J支持在程序中以編程的方式設置這些組件,還支持通過配置文件來配置組件,后一種方式更為靈活。
Log4J支持兩種配置文件格式,一種是XML格式,一種是Java屬性文件,
1.配置Logger組件
如果配置rootLogger,語法為
Log4j.rootLogger=[priority],appenderName,appendName… |
其中,priority是日志級別,可選值包括OFF,FATAL,ERROR,WARN,INFO,DEBUG和ALL.通過在這里定義了級別, 可以控制應用程序中相應級別的日志信息的開關,比如在這里定義了INFO級別,則應用程序中所有DEBUG級別的日志信息將不被打印出來。
appenderName指定Appender組件,用戶可以同時指定多個Appender組件。
如果配置用戶自己的Logger組件,語法為:
log4j.logger.loggerName=[priority],appenderName.appenderName… |
2. 配置Appender組件
配置日志信息輸出的目的地Appender,其語法為:
Log4j.appender.appenderName=fully.qualified.name.of.appender.class Log4j.appender.appenderName.optionN=value1 …. Log4j.appender.appenderName.optionN=valueN |
Log4J提供的Appender有以下幾種:
l org.apache.log4j.ConsoleAppender(控制臺)
l org.apache.log4j.FileAppender(文件)
l org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件)
l org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
l org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)
3.配置Layout組件
配置Layout組件的語法為:
Log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class |
Log4J提供的Layout有以下幾種:
l org.apache.log4j.HTMLLayout(以HTML表格形式布局)
l org.apache.log4j.PatternLayout(可以靈活地指定布局模式)
l org.apache.log4j.SimpleLayout(包含日志信息級別和信息字符串)
l org.apache.log4j.TTCCLayout(包含日志產生的時間、線程和類別等信息)
PatternLayout的格式
符 號 |
描 述 |
%r |
自程序開始后消耗的毫秒數 |
%t |
表示日志記錄請求生成的線程 |
%p |
表示日志信息級別 |
%d{} |
日志信息產生時間 |
%c |
日志消息所在的類名 |
%m%n |
表示日志消息的內容 |
在程序中訪問Log4J,需要用到Log4J的JAR文件。
在程序中使用Log4J包含以下過程:
l 獲得日志記錄器
l 讀取配置文件,配置Log4J環境
l 輸出日志信息
在helloapp應用中使用Log4J
如果在Web應用中使用Log4j,需要創建一個Log4J的配置文件并且配置log4J環境,然后就可以在其他Web應用組件中獲取Logger對象并輸出日志。
1. 創建Log4j. properties文件
(1) 將Log4J的JAR文件拷貝到以下目錄
<CATALINA_HOME>/webapps/xxx/WEB-INF/lib
(2)創建Log4J的配置文件log4j.properties,它的存放目錄為
<CATALINA_HOME>/webapps/xxx/WEB-INF/classes
log4j.rootLogger=INFO, console, file log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=d:/Log/log.txt log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%t %p - %m%n log4j.appender.file.layout=org.apache.log4j.HTMLLayout log4j.appender.file.layout.ConversionPattern=%t %p - %m%n |
2.創建用于配置Log4J環境的HelloAction
package hello; …… import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public final class HelloAction extends Action { public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)throws Exception { Log log = LogFactory.getLog("helloapplog"); log. fatal("This is a fatal message"); log. error("This is a error message"); log. warn("This is a warn message"); log. info("This is a info message"); log. debug("This is a debug message"); log. trace("This is a trace message");
if(log.isDebugEnabled()) log.debug("This is a debug message"); if(log.isErrorEnabled()) log.error("This is a error message"); MessageResources message=getResources(request); ………… } } |
3.在控制臺中輸出日志,查看我們的控制臺
啟動Tomcat服務器,訪問http://localhost:8080/helloapp/login.jsp,當我們正確輸入一個用戶名地時候,我們就會在Tomcat服務器的控制臺看到日志
在d:/Log/log.txt目錄下會看到一個log.txt文件
小結
Log4J主要由3大組件構成:Logger、Appender和Layout。Logger控制日志信息的輸出;Appender決定日志信息的 輸出目的地;Layout決定日志信息的輸出格式。Log4J允許用戶在配置文件中靈活地配置這些組件。在程序中使用Log4J非常方便,只要先取得日志 記錄器,然后讀取配置文件并配置Log4J環境,接下來就可以在程序中任何需要輸出日志的地方,調用Logger類的適當方法來生成日志。