2007年8月29日 星期三

log4j 學習筆記

做為一個Log 工具, log4j 是常被使用, 也很方便, 功能也很多的工具,以下簡單介紹建立的範例。
一、apache log4j project website:
http://logging.apache.org/log4j/docs/
二、jar file download:(log4j-1.2.14.jar)
http://logging.apache.org/site/binindex.cgi
三、做一個簡單的登入頁面。

<form action="/loggerTest/goServlet">
name:<input type="text" name="name"><br>
password:<input type="password" name="password"><br>
<input type="submit" value="submit">
</form>

四、web.xml

<servlet>
<servlet-name>log</servlet-name>
<servlet-class>servlet.LogDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>log</servlet-name>
<url-pattern>/goServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

五、Servlet(放於WEB-INF/classes/LogDemo.class)

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class LogDemo extends HttpServlet{
static Logger log = Logger.getLogger(LogDemo.class);

protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();


//Log4j預設的設定檔
BasicConfigurator.configure();



//讀 log4j.properties
Properties p = new Properties();
p.load(LogDemo.class.getClassLoader().getResourceAsStream("log4j.properties"));
PropertyConfigurator.configure(p);

log.info("start......");

out.print("youname is "+req.getParameter("name"));
log.info("name is"+req.getParameter("name"));

out.print("<br>your passwrod is"+req.getParameter("password"));
log.info("password is"+req.getParameter("password"));

log.info("end.....");
}
}

六、log4j.properties(放於WEB-INF/classes/log4j.properties)

#level=info, 兩種輸出 分別為 A1,A2
log4j.rootLogger=info ,A1,A2

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m%n

# A2 is set to be a file
log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%d{HH:mm:ss:SSS}][%C-%M] %m%n
log4j.appender.A2.File=C:/temp/testLog.log

七、說明

  • log4j.properties

  • (1)RootLogger:
    log4j.rootCategory = [level] , appenderName, appenderName, ...
    level:DEBUG、INFO、WARN、ERROR、FATAL(ALL、OFF)
    (2)log4j.appender.XXX
    WriterAppender----ConsoleAppender(控制台)
    ----FileAppender(文件)---DailyRollingFileAppender(日誌文件)
    ---RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
    (3)log4j.appender.XXX.layout
    * org.apache.log4j.HTMLLayout(HTML表格形式)
    * org.apache.log4j.PatternLayout(可以指定佈局模式)
    * org.apache.log4j.SimpleLayout(包含日誌訊息的級別和訊息字串)
    * org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等等訊息)
    (4)PatternLayout參數說明
    * %c 輸出日誌訊息所屬的類別的全名
    * %d 輸出日誌時間點的日期或時間,指定格式的方式:%d{yyyy/MM/dd HH:mm:ss}。
    * %l 輸出日誌事件的發生位置,即輸出日誌訊息的語句處於它所在的類別的第幾行。
    * %m 輸出代碼中指定的訊息,如log(message)中的message。
    * %n 輸出一個列尾符號。
    * %p 輸出優先階層,即DEBUG,INFO,WARN,ERROR,FATAL。如果是調用debug()輸出的,則為DEBUG,依此類推。
    * %r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
    * %t 輸出產生該日誌事件的線程名。
    * %r 輸出自應用啟動到輸出該日誌訊息所耗費的毫秒數。
    * %f 輸出日誌訊息所屬的類別的類別名。