1. 程式人生 > >關於log4j日誌檔案的配置

關於log4j日誌檔案的配置

成功配置tomcat的log4j日誌系統,格式:HTML+每天以yyyy-mm-dd.log命名的日誌檔案
一、引言:
    實習單位讓用log4j配置webapp的日誌系統,要求產生的日誌檔案是html格式,並且是每天以yyyy-mm-dd日期格式命名的日誌檔案。
    這個曾經讓自己費神了一段時間,最近花了兩天時間總算配置成功了!不過配置成功的是tomcat的,不是單個webapp的,現把步驟記錄下來,晚上再配置webapp的。先寫一步一步的操作,後面再講解一些log4j的關鍵知識點。

二、一步一步配置tomcat log4j日誌系統

第一步:下載log4j.jar,並把log4j.jar放入$CATALINA_HOME/common/lib.
第二步:新建log4j.properties檔案,放到$CATALINA_HOME/common/classes/目錄下.
第三步:寫配置檔案log4j.properties:
#log4j.properties

log4j.rootLogger=warn, A1

log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.file=F:/UserWorkSpace/jiangcm/Tomcat 5.0/logs/tomcat_log_
log4j.appender.A1.DatePattern=yyyy-MM-dd'.html'
log4j.appender.A1.layout=org.apache.log4j.HTMLLayout

log4j.logger.org.apache=warn


註解:
1)你只需要修改這一行:

log4j.appender.R.File=F:/UserWorkSpace/jiangcm/Tomcat 5.0/logs/tomcat_log_

將路徑修改為你的Tomcat的logs目錄,如果你的系統環境配置了CATALINA_HOME環境變數,那麼可以使用${catalina.home}/logs/tomcat_log_進行配置即可。

2)上面的log4j配置僅記錄比較重要的日誌(警告warning、錯誤error、致命錯誤fatal)到Tomcat的logs目錄下的tomcat_log_ 檔案中,每天晚上過0點的第一條資訊會觸發重新命名tomcat_log_,將當前日期附加在tomcat_log_ 檔名中,併產生新的tomcat_log_ 檔案。

3)使用FileAppender可以將log資訊輸出到檔案中,但是如果檔案太大了讀起來就不方便了。這時就可以使用 DailyRollingAppender。DailyRollingAppender可以把Log資訊輸出到按照日期來區分的檔案中。如上述log4j.properties配置檔案就會每天產生一個html檔案,每個html檔案只記錄當天的log資訊。

4)設定了DailyRollingAppender 以後如果配置項裡面設定了檔案的最大值,那麼應該去掉,否則可能不能產生以天為單位的日誌。

5)Log4j的org.apache.log4j.DailyRollingFileAppender原始碼223行
scheduledFilename = fileName+sdf.format(new Date(file.lastModified()));

也就是說備份的日至檔案都是檔名後面加上你所配的DatePattern格式化後的字串。除非你自己寫個appender。

6)上述log4j.properties生成的日誌檔案,名稱格式如下:tomcat_log_2007-02-24.html;
注意:生成的第一個日誌檔案格式如下:tomcat_log_,即只是A1.file中設定的名稱;生成的第二個日誌檔案之後的檔案命名才會加上所配的DatePattern格式化後的字串。

7)配置DailyRollingFileAppender格式的日誌系統,如果要驗證生成的日誌檔案結果,要注意一點,需要關閉tomcat,修改系統日期為第二天的日期,再重啟tomcat,這樣才能自動生成一個新的日誌檔案;因為要修改日期才能觸發產生新的日誌檔案。


第四步:重啟tomcat.

ok,現在就已經在tomcat中配置好log4j了。

第五步:驗證

驗證上述配置的log4j日誌系統:

    利用tomcat自帶的web應用程式jsp-examples,現在配置好了日誌系統,那麼如果在jsp-examples這個web應用程式的.java檔案中使用了日誌,則IE訪問這個web app的jsp檔案時,就應該能夠自動產生日誌檔案到配置的路徑中。

    步驟:
    a)進入目錄“F:/UserWorkSpace/jiangcm/Tomcat 5.0/webapps/jsp-examples/WEB-INF/classes/dates”;
    b)修改JspCalendar.java檔案,在這個檔案中加上日誌的程式碼,如下所示:
package dates;

import java.text.DateFormat;
import java.util.*;
import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import org.apache.log4j.*;


public class JspCalendar {
    Calendar calendar = null;
    static Logger logger = Logger.getLogger(JspCalendar.class);


    public JspCalendar() {
logger.debug("This is debug.");
logger.info("This is an info.");
logger.warn("This is a warning.");
logger.error("This is an error.");
logger.fatal("This is a fatal error.");

    calendar = Calendar.getInstance();
    Date trialTime = new Date();
    calendar.setTime(trialTime);
    }

    public int getYear() {

    return calendar.get(Calendar.YEAR);

    }
……
}

註釋:
加上的程式碼有兩部分,一是構造一個logger物件,一是輸出logger資訊,如下所示,其他程式碼沒動:
static Logger logger = Logger.getLogger(JspCalendar.class);

logger.debug("This is debug.");
logger.info("This is an info.");
logger.warn("This is a warning.");
logger.error("This is an error.");
logger.fatal("This is a fatal error.");

    c)重新編譯JspCalendar.java;
    d)修改日期為2007-02-26;
    e)重啟tomcat;
    f)在IE中輸入“http://localhost:8086/jsp-examples/dates/date.jsp”,執行該jsp檔案;
    g)這時在目錄“F:/UserWorkSpace/jiangcm/Tomcat 5.0/logs”下看到了新產生的日誌檔案:tomcat_log_2007-02-25.html.
   
    ok!說明日誌系統配置成功啦,啦~!!

三、遺留問題
3.1 上述配置的是tomcat的日誌系統,應該是對tomcat下的所有webapp都起作用,現在自己只驗證了jsp-examples這個webapp,還沒有驗證過其他的webapp。

3.2 配置的是tomcat的日誌系統,輸出的應該都只是tomcat的標準輸入/輸出資訊等,感覺webapp的日誌資訊應該和tomcat的系統日誌資訊分開,但是應該怎麼分開呢?如果對每個webapp單獨配置日誌系統,那麼這些日誌內容會輸出到tomcat的系統日誌中嗎?

3.3 不需任何配置,tomcat5.0的預設日誌目錄“F:/UserWorkSpace/jiangcm/Tomcat 5.0/logs”下就有按日期產生的日誌檔案,檔案命名格式如下:localhost_log.2007-02-26.txt,並且這個檔案是自動生成的,上述配置在目錄“F:/UserWorkSpace/jiangcm/Tomcat 5.0/logs”下生成了tomcat_log_2007-02-25.html檔案,並且tomcat本身也自動生成了一個localhost_log.2007-02-26.txt檔案,相當於自動生成了兩個日誌檔案。
當然這兩個日誌檔案的內容不同,tomcat_log_2007-02-25.html中的內容如下:
待貼圖

而localhost_log.2007-02-26.txt的內容如下:
2007-02-26 14:03:21 StandardContext[/balancer]org.apache.webapp.balancer.BalancerFilter: init(): ruleChain: [org.apache.webapp.balancer.RuleChain: [org.apache.webapp.balancer.rules.URLStringMatchRule: Target string: News / Redirect URL: http://www.cnn.com], [org.apache.webapp.balancer.rules.RequestParameterRule: Target param name: paramName / Target param value: paramValue / Redirect URL: http://www.yahoo.com], [org.apache.webapp.balancer.rules.AcceptEverythingRule: Redirect URL: http://jakarta.apache.org]]
2007-02-26 14:03:22 StandardContext[/jsp-examples]ContextListener: contextInitialized()
2007-02-26 14:03:22 StandardContext[/jsp-examples]SessionListener: contextInitialized()
2007-02-26 14:03:22 StandardContext[/servlets-examples]ContextListener: contextInitialized()
2007-02-26 14:03:22 StandardContext[/servlets-examples]SessionListener: contextInitialized()

感覺就是localhost_log.2007-02-26.txt中是tomcat的系統日誌,而omcat_log_2007-02-25.html中是.java中自己寫的logger的內容。

那麼,是不是tomcat5中系統日誌就會自動按日生成,不需配置;開發人員如果需要日誌系統,那麼就在自己的webapp中配置一個,而不需要管tomcat的系統日誌了???

3.4 tomcat_log_2007-02-25.html與localhost_log.2007-02-26.txt內容不同的原因有沒有可能是因為:
自己的log4j.properties中設定apache的級別是warn:??
log4j.logger.org.apache=warn

剛驗證了一下,好像沒有關係,“log4j.logger.org.apache=warn”這句好像不僅對localhost_log.2007-02-26.txt無影響,而且對tomcat_log_2007-02-25.html的輸出也無影響。
那麼“log4j.logger.org.apache=warn”這句的作用是什麼呢???

3.5 webapp中如何配置日誌系統,並且把webapp的日誌資訊與tomcat自身的系統日誌分開???

四、參考資料:
1.我想每一天都產生一個以"yyyy-mm-dd.log"命名日誌檔案,請問該怎麼配置file選項,謝謝了!
http://community.csdn.net/Expert/TopicView3.asp?id=4788993

2.使用log4j為Tomcat輸出日誌
http://www.chinawin.net/myblog/archives/314-log4jTomcataeoeOE.html

1. 如果Tomcat當前正在執行,關閉Tomcat。
2. 從Apache的網站下載Commons Logging發行包。
3. 將壓縮包中的commons-logging.jar解壓縮到你Tomcat安裝路徑的common/lib目錄中。
4. 從Apache的網站下載Log4j發行包。
5. 將壓縮包中的log4j-1.2.12.jar解壓縮到你Tomcat安裝路徑的common/lib目錄中。
6. 在Tomcat安裝路徑的common/classes 建立log4j的配置檔案log4j.properties(配置檔案在隨後一節)。
7. 重起Tomcat


3.在Web應用中使用log4j
http://www.3doing.net/forums/printpage.asp?BoardID=11&ID=184

注意:上面的load-on-startup應設為1,以便在Web容器啟動時即裝入該Servlet。log4j.properties檔案放在根的properties子目錄中,也可以把它放在其它目錄中。應該把.properties檔案集中存放,這樣方便管理。

4.og4j日誌檔案路徑的配置
http://wangluwww.spaces.live.com/blog/

解決log4j輸出的日誌檔案的位置的配置問題

我一直希望自己的web應用的配置能夠簡化,最好的方式就是打個包後扔哪都能用,即使非得再做一些配置的話,也希望只是一些連線池的配置資訊。這個目標在現在手頭的這個專案中也幾乎達到了,除了log檔案的位置。
在log4j的配置檔案中對於log輸出的路徑一向都是使用絕對路徑,這樣就導致在不同的機器上部署時都得重新定義一下log檔案的輸出位置。雖說費時不多,可對於我這種寧可少一事,不願多一事的人來說,總是覺得有點鬱悶。
踏破鐵鞋無覓,得來不費功夫。不經意見看到了一個文件,介紹說log4j的配置檔案支援windows的環境變數,格式類似velocity:${env},ok,問題解決:
一般來說我們會將一些初始化的資訊放到web.xml中,以便在系統啟動時就執行。循此思路,將log檔案的位置放到webapp下面的任意處,如webapp/WEB-INF/conf/logs下面,則可以在log4j.properties檔案中做如下定義:
log4j.appender.R.File=${webappHome}/WEB-INF/conf/logs/sysout.log
其中的${webappHome}即是通過System.setProperty("webappHome", webappHome);實現的,此操作可通過一初始的servlet進行,具體方法略。

5. Log4j優化
http://www.3doing.net/forums/printpage.asp?BoardID=11&ID=184

有多少人用Log4j的時候會在每一個Debug/Info之前加一個判斷?

可能很多人都說了,這有什麼關係,我在執行的時候是把Log Level設定成Error的。

那麼請看下面這個程式碼:

String result;
...
...
...
logger.debug(”result is” + result );

再看看這個程式碼:

String result;
...
...
...
if(logger.isDebugEnabled())
{
       logger.debug(”result is” + result );
}


把Log Level設定成ERROR,執行結果又區別嗎?沒有!!
程式的效能有區別嗎?區別大了!!!

因為什麼呢?

雖然第一段程式碼也不產生Log輸出,但是debug()裡面的字串變數是例項化了,明白了嗎?

這個就是為什麼很多人抱怨Log4j佔用很大CPU時間的原因了,尤其是在大迴圈的時候。