1. 介紹
1.1. Log4j 是什么?
Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日志信息輸送的目的地是控制臺、文件、GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;我們也可以控制每一條日志的輸出格式;通過定義每一條日志信息的級別,能夠更加細致地控制日志的生成過程,而這些可以通過一個配置文件來靈活地進行配置,不需要修改應用的代碼。
1.2. 構成Log4j的三大類組件
(1) Logger : 負責輸出信息日志信息,并能夠對日志信息過濾,確定哪些日志信息輸出,哪些信息被忽略。
(2) Appender : 指定日志輸出到什么地方,可以是控制臺、文件或網絡設備等等。
(3) Layouts : 加在Appender后面用以實現格式化輸出日志的內容。
2. Log4j的設置
第一步:加入log4j的jar包到lib下。
第二步:在CLASSPATH下建立log4j.properties或XML格式的配置文件。
第三步:導入所有需的commongs-logging類:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
第四步:在自己的類中定義一個org.apache.commons.logging.Log類的私有靜態類成員:
private final Log log = LogFactory.getLog(getClass());
LogFactory.getLog()方法的參數使用的是當前類的class。
第五步:使用org.apache.commons.logging.Log類的成員方法輸出日志信息:
例如:if (log.isDebugEnabled())
{log.debug("Test log4j!");}
3. Log4j的配置文件
3.1 Log4j輸出日志信息的優先級
Log4j輸出日志信息的級別分別為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級別。Log4j建議只使用四個級別,優先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,可以控制到應用程序中相應級別的日志信息的開關。比如在這里定義了INFO級別,只有等于及高于這個級別的才進行處理,則應用程序中所有DEBUG級別的日志信息將不被打印出來。ALL:打印所有的日志,OFF:關閉所有的日志輸出。
3.2 Log4j配置文件的詳細介紹
Log4j支持兩種配置文件格,一種是XML格式的文件,一種是Java特性文件log4j.properties(鍵=值)。下面將介紹使用log4j.properties文件作為配置文件的方法:
①、 配置根Logger
Logger 負責處理日志記錄的大部分操作。
其語法為:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志記錄的優先級。
②、 配置日志信息輸出目的地 Appender
Appender 負責控制日志記錄操作的輸出。
其語法為:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN
這里的appenderName為在①里定義的,可任意起名。
其中,Log4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender(控制臺),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件),
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),可通過log4j.appender.R.MaxFileSize=100KB設置文件大小,還可通過log4j.appender.R.MaxBackupIndex=1設置為保存一個備份文件。
org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)
例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender
定義一個名為stdout的輸出目的地,ConsoleAppender為控制臺。
③、配置日志信息的格式(布局)Layout
Layout 負責格式化Appender的輸出。
其語法為:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.optionN = valueN
其中,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平臺為“rn”,Unix平臺為“n”
%d 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。
4.Logger組件的繼承性
Log4j中定義的Logger可以有繼承關系,Log4j提供了一個root Logger,它是所有Logger的”根”,其它的Logger都會繼承root Logger.Logger 之間的繼承關系是通過名稱體現的,例如:log4j.logger.helloappLogger.childLogger的名稱是在log4j.logger.helloappLogger之后加符號“.”定義的,則childLogger繼承helloappLogger.
Logger組件的繼承關系有以下特點:
● 如果子Logger沒有定義日志級別,則繼承父Logger的日志級別。
● 如果子Logger定義了日志級別,則不會繼承父Logger的日志級別。
● 默認情況,子Logger會繼承Logger的所有Appender,反它們加入到自己的Appender中。
附錄 A Log4j配置相對路徑實現日志記錄
解決Log4j配置相對路徑實現日志記錄有三種辦法:
①、 用相對路徑代替絕對路徑
其實log4j的FileAppender本身就有這樣的機制,如:log4j.appender.logfile.File=${WORKDIR}/logs/app.log其中“${WORKDIR}/”是個變量,會被System Property中的“WORKDIR”的值代替。這樣,我們就可以在log4j加載配置文件之前,先用System.setProperty設置好根路徑
②、 可以使用環境變量
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${catalina.base}/logs/logs_tomcat.log
log4j.appender.R.MaxFileSize=10KB
③、 采用了動態改變日志路徑方法來實現相對路徑保存日志文件
代碼:
public class Log4jInit extends HttpServlet {
static Logger logger = Logger.getLogger(Log4jInit.class);
public Log4jInit() { }
public void init(ServletConfig config) throws ServletException {
String prefix = config.getServletContext().getRealPath("/"); String file = config.getInitParameter("log4j");
String filePath = prefix + file;
Properties props = new Properties();
try {
FileInputStream istream = new FileInputStream(filePath);
props.load(istream);
istream.close();
String logFile = prefix + props.getProperty("log4j.appender.file.File");//設置路徑
props.setProperty("log4j.appender.file.File",logFile);
PropertyConfigurator.configure(props);//裝入log4j配置信息
} catch (IOException e) {
toPrint("Could not read configuration file [" + filePath + "]."); toPrint("Ignoring configuration file [" + filePath + "]."); return; }
}
public static void toPrint(String content) {
System.out.println(content);
}
}
(2).Web.xml中的配置
代碼
- <servlet>
- <servlet-name>log4j-init</servlet-name>
- <servlet-class>Log4jInit</servlet-class>
- <init-param>
- <param-name>log4j</param-name>
- <param-value>WEB-INF/classes/log4j.properties</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
</servlet>
posted on 2008-06-01 14:11
長春語林科技 閱讀(4937)
評論(0) 編輯 收藏 所屬分類:
util 、
java