一般要使用log4j寫log,都直接在一個system util class中
public static Category logger = null;
static {
logger = Logger.getLogger("A_project");
}
然後在各project src裡,寫個log4j.properties來做些細部設定
只有一個project時,使用上並沒有什麼問題
但當有多個projects時,問題就來了




有時候會遇到A project可以寫log,B project卻出問題
有時後情況則是相反,整個非常的不聽話

後來發現,哪個project在AP server中先start
log4j.properties先載入後,其他projects的log4j.properties就會失效
因此導致只有一個project的log可以正常運作


好吧,那就想個辦法來解決
大家的log4j.properties都寫一樣就可以了吧
也就是,假設共有3個AP在AP server上
A project中的log4j.properties內容,除了A project自己的設定外
也要包含其他2個projects的設定
另外其他兩個projects的log4j.properties也要這樣做


如此一來,不論AP server先載入哪個project的設定檔
由於內容都相同,所以,各project的log就正常囉


但是但是,這又帶來了另一個問題-log4j.properties管理不易
有新的project,所有的project都要改,非常的不方便


最後,注意囉~~終極方案來了
不論是在web container上跑的web project
或是在J2EE server上跑的ejb project

1. 共用log4j.properties存放路徑

a. 找一個共用的log4j.properties存放路徑
b. 各project依照project name(ex: a_project.log4j.properties),將設定檔統一放在此路徑下

2. system util class寫法

public static Category A_logger = null;
public static Category B_logger = null;
public static Category C_logger = null;

static{

try{
Properties pro = new Properties();
File fdir = new File("/home/log/log_prop");
File[] fspro = fdir.listFiles();

for (int i = 0; i < fspro.length; i++) {
if ( fspro[i].getName().toLowerCase().endsWith("log4j.properties")) {
Properties temppro = new Properties();
temppro.load(new FileInputStream(fspro[i]));

for (Enumeration e = temppro.keys(); e.hasMoreElements();) {
String key = (String) e.nextElement();
pro.setProperty(key, temppro.getProperty(key));
}
}
}
PropertyConfigurator.configure(pro);

logger = Logger.getLogger("A_categoryName");
logger = Logger.getLogger("B_categoryName");
logger = Logger.getLogger("C_categoryName");


}catch(Exception ex){
ex.printStackTrace();
}
}

這樣就統一載入多個projects設定檔
有新的project的話,也不用再改其他projects的設定檔了
直接把自己project設定檔丟入共同存放路徑即可

創作者介紹
創作者 babyincar 的頭像
babyincar

 [孩子在車上‧Babyincar's Blog]

babyincar 發表在 痞客邦 留言(1) 人氣()


留言列表 (1)

發表留言
  • 阿蛇
  • 終於解了我當年的困擾....