[轉(zhuǎn)]如何初始化 Java Web 應(yīng)用程序的 log4j

原文: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)建此目錄)轩拨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市院喜,隨后出現(xiàn)的幾起案子亡蓉,更是在濱河造成了極大的恐慌,老刑警劉巖够坐,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寸宵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡元咙,警方通過(guò)查閱死者的電腦和手機(jī)梯影,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)庶香,“玉大人甲棍,你說(shuō)我怎么就攤上這事「弦矗” “怎么了感猛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵七扰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我陪白,道長(zhǎng)颈走,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任咱士,我火速辦了婚禮立由,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘序厉。我一直安慰自己锐膜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布弛房。 她就那樣靜靜地躺著道盏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪文捶。 梳的紋絲不亂的頭發(fā)上荷逞,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音拄轻,去河邊找鬼颅围。 笑死,一個(gè)胖子當(dāng)著我的面吹牛恨搓,可吹牛的內(nèi)容都是我干的院促。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼斧抱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼常拓!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起辉浦,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤弄抬,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后宪郊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體掂恕,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年弛槐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懊亡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乎串,死狀恐怖店枣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤鸯两,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布闷旧,位于F島的核電站,受9級(jí)特大地震影響钧唐,放射性物質(zhì)發(fā)生泄漏忙灼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一逾柿、第九天 我趴在偏房一處隱蔽的房頂上張望缀棍。 院中可真熱鬧宅此,春花似錦机错、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至璧亮,卻和暖如春萧诫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枝嘶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工帘饶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人群扶。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓及刻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親竞阐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缴饭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評(píng)論 6 342
  • 在應(yīng)用程序中添加日志記錄總的來(lái)說(shuō)基于三個(gè)目的:監(jiān)視代碼中變量的變化情況,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計(jì)分析...
    時(shí)待吾閱讀 4,988評(píng)論 0 6
  • 在應(yīng)用程序中添加日志記錄總的來(lái)說(shuō)基于三個(gè)目的:監(jiān)視代碼中變量的變化情況骆莹,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計(jì)分析...
    時(shí)待吾閱讀 5,050評(píng)論 1 13
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理颗搂,服務(wù)發(fā)現(xiàn),斷路器幕垦,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法丢氢,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法先改,繼承相關(guān)的語(yǔ)法疚察,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,638評(píng)論 18 399