原文:http://www.codejava.net/coding/how-to-initialize-log4j-for-java-web-application
通常秃流,對(duì)于Java Web應(yīng)用程序蚊伞,我們可以將log4j.properties文件或log4j.xml文件放在類(lèi)路徑(WEB-INF \ classes目錄)的根目錄下另伍,在servlet類(lèi)中立即使用log4j,如下所示:
Logger logger = Logger.getLogger(MyServlet.class);
logger.debug("this is a debug log message");
但是,如果將log4j配置文件放在另一個(gè)位置而不是類(lèi)路徑的根目錄下呢?在這種情況下厕诡,我們需要明確地初始化log4j:
String log4jConfigFile = "some/path/log4j.properties";
PropertyConfigurator.configure(log4jConfigFile);
但是,當(dāng)應(yīng)用程序啟動(dòng)時(shí)营勤,這個(gè)初始化代碼只能執(zhí)行一次灵嫌。為此,建議聲明ServletContextListener接口的實(shí)現(xiàn)葛作,以監(jiān)聽(tīng)在應(yīng)用程序啟動(dòng)時(shí)發(fā)生的contextInitialized()事件寿羞,然后再提供客戶端的請(qǐng)求。例如:
public class ContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
// code to initialize log4j here...
}
}
以下是在Java Web應(yīng)用程序中初始化和使用log4j的步驟:
1.創(chuàng)建log4j屬性文件
創(chuàng)建一個(gè)名為log4j.properties的log4j配置文件赂蠢,其中包含以下內(nèi)容:
# LOG4J configuration
log4j.rootLogger=DEBUG, Appender1,Appender2
log4j.appender.Appender1=org.apache.log4j.ConsoleAppender
log4j.appender.Appender1.layout=org.apache.log4j.PatternLayout
log4j.appender.Appender1.layout.ConversionPattern=%-7p %d [%t] %c %x - %m%n
log4j.appender.Appender2=org.apache.log4j.FileAppender
log4j.appender.Appender2.File=D:/Logs/Log4jWebDemo.log
log4j.appender.Appender2.layout=org.apache.log4j.PatternLayout
log4j.appender.Appender2.layout.ConversionPattern=%-7p %d [%t] %c %x - %m%n
此配置基本上創(chuàng)建兩個(gè)appender:第一個(gè)用于控制臺(tái)日志記錄绪穆,第二個(gè)用于文件記錄(日志文件將在D:/Logs/Log4jWebDemo.log下創(chuàng)建)。
將log4j.properties文件放在Web應(yīng)用程序的WEB-INF目錄下。
2.在web.xml中配置log4j屬性文件的位置
還建議通過(guò)web.xml文件配置log4j.properties文件的位置霞幅,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Log4jWebDemo1</display-name>
<context-param>
<param-name>log4j-config-location</param-name>
<param-value>WEB-INF/log4j.properties</param-value>
</context-param>
</web-app>
這里我們?cè)赪EB-INF目錄下配置log4j.properties文件漠吻。
3.實(shí)現(xiàn)ServletContextListener接口
創(chuàng)建一個(gè)使用以下代碼實(shí)現(xiàn)ServletContextListener接口的ContextListener類(lèi):
package net.codejava.servlet;
import java.io.File;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import org.apache.log4j.PropertyConfigurator;
@WebListener("application context listener")
public class ContextListener implements ServletContextListener {
/**
* Initialize log4j when the application is being started
*/
@Override
public void contextInitialized(ServletContextEvent event) {
// initialize log4j here
ServletContext context = event.getServletContext();
String log4jConfigFile = context.getInitParameter("log4j-config-location");
String fullPath = context.getRealPath("") + File.separator + log4jConfigFile;
PropertyConfigurator.configure(fullPath);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
// do nothing
}
}
在contextInitialized()方法中量瓜,我們讀取log4j屬性文件的位置司恳,并構(gòu)造一個(gè)完整的絕對(duì)路徑,然后傳遞給PropertyConfigurator類(lèi)的靜態(tài)configure()方法绍傲。這就是log4j用給定的屬性文件初始化扔傅。
請(qǐng)注意,@WebListener注釋?zhuān)⊿ervlet 3.0)放置在類(lèi)聲明之前烫饼,以告知servlet容器將此類(lèi)注冊(cè)為偵聽(tīng)器猎塞。如果您使用Servlet 2.5,請(qǐng)?jiān)趙eb.xml文件中使用以下等效的XML :
<listener>
<listener-class>net.codejava.servlet.ContextListener</listener-class>
</listener>
4.寫(xiě)一個(gè)測(cè)試servlet
現(xiàn)在創(chuàng)建一個(gè)簡(jiǎn)單的servlet來(lái)測(cè)試log4j杠纵。創(chuàng)建一個(gè)包含以下內(nèi)容的TestLog4jServlet.java類(lèi):
package net.codejava.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
@WebServlet("/test")
public class TestLog4jServlet extends HttpServlet {
static final Logger LOGGER = Logger.getLogger(TestLog4jServlet.class);
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
LOGGER.info("This is a logging statement from log4j");
String html = "<html><h2>Log4j has been initialized successfully!</h2></html>";
response.getWriter().println(html);
}
}
這個(gè)servlet只是將一個(gè)日志條目寫(xiě)入記錄器荠耽,并向客戶端發(fā)送一個(gè)簡(jiǎn)短的HTML文本。
由于我們使用@WebServlet注解(Servlet 3.0)比藻,因此無(wú)需在web.xml文件中配置此servlet 铝量。如果您使用Servlet 2.5,請(qǐng)將以下XML代碼段添加到web.xml文件中:
<servlet>
<display-name>TestServlet</display-name>
<servlet-name>TestServlet</servlet-name>
<servlet-class>net.codejava.servlet.TestLog4jServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
5.測(cè)試應(yīng)用程序
如果您在Eclipse IDE中執(zhí)行了上述步驟银亲,您將具有以下項(xiàng)目結(jié)構(gòu):
記住在WEB-INF \ lib目錄下添加log4j的庫(kù)jar文件(可以在這里下載log4j )慢叨,并創(chuàng)建一個(gè)目錄D:/ Logs,其中將創(chuàng)建一個(gè)日志文件(在log4j.properties文件中配置)务蝠。
在Tomcat等servlet容器上部署應(yīng)用程序拍谐,在瀏覽器的地址欄中輸入以下URL來(lái)測(cè)試servlet和log4j:
HTTP://本地主機(jī):8080 / Log4jWebDemo1 /測(cè)試
在瀏覽器中輸出:
看看服務(wù)器的控制臺(tái)日志,我們將看到一個(gè)log4j樣式的日志條目馏段,如下所示:
并檢查L(zhǎng)og4jWebDemo.log文件將在D:/ Logs目錄下創(chuàng)建(您應(yīng)該首先創(chuàng)建此目錄)轩拨。