2009-02-12 51 views
0

我已經使用log4j來使用FileAppender執行looging錯誤日誌。問題是它記錄了同樣的錯誤在日誌文件中兩次當以下情況在log4j錯誤日誌和異常處理中遇到問題

案例1:

Class1 : 

public void func(){ 
    try{ 
     new Class2.prop() 
    }catch(IOException ioe){ 
     logger.log(2,ioe); 
    } 
} 

Class2 : 

public void prop(){ 
    try{ 
     //error oocurs here 
    }catch(FileNotFoundException fe){ 
     logger.log(2,fe); 
    } 
} 

Error : 
    Class2 .FileNotFoundException 
    at Class2.prop(Class2.java:3) 
    at Class1.func(Class1.java:4) 

Log File : 

    FileNotFound exception 
    FileNotFound exception 

但其記錄錯誤一個時間如下情況。

案例2:

Class1 : 

public void func(){ 
    try{ 
     new Class2.prop() 
     //error oocurs here 
    }catch(IOException ioe){ 
     logger.log(2,ioe); 
    } 
} 

Class2 : 
    public void prop(){ 
     try{ 
     }catch(FileNotFoundException fe){ 
      logger.log(2,fe); 
     } 
    } 

Error : 
    Class2 .IOException 
    at Class1.func(Class1.java:4) 

Log File : 
    IOException exception 

幫助我該怎麼做才能在錯誤日誌中唯一一次在日誌文件等。無論是。

+0

Raja請提供您在日誌文件中獲得的例外的完整文本。 – 2009-02-12 06:52:28

+0

@raja:如果您之前添加了4個空格,網站可以自動生成代碼。看看我的編輯。 – OscarRyz 2009-02-12 06:53:59

回答

3

但是在下面的情況下記錄一次錯誤。

那是因爲你處理例外:

的Class1:

public void func() { 
    try{ 
     new Class2.prop() 
    }catch(IOException ioe){ 
     logger.log(2,ioe);    
    } 
} 

等級2:

public void prop() throws IOException { 
    try{ 
     //error oocurs here 
    }catch(FileNotFoundException fe){ 
     logger.log(2,fe); 
     throw fe; 
    } 
    // Here!!!!! 
} 

在類class2您catch塊(後您的/ /錯誤在這裏)你記錄異常,這就是你有在你的日誌上。

但是,由於您只是記錄異常,所以您告訴程序異常已被控制或處理(這是更合適的),並且程序繼續流向我添加註釋的行// 這裏!!!!!

在class1的後面,由於處理了異常,因此try/catch塊中沒有任何反應,並且第二個異常從不記錄(如您所期望的),因爲它從未發生過。

如果你想看到兩個日誌(我認爲這是不必要的),你應該重新拋出異常,正如我在你的class2中一樣,並且修改方法簽名來標記它指出拋出一個IOException。

這樣你將有兩個日誌。

更好的將是這樣的:

的Class1:

public void func() { 
    try{ 
     new Class2.prop() 
    }catch(IOException ioe){ 
     logger.log(2,ioe);    
    } 
} 

等級2:

public void prop() throws IOException { 
     //error oocurs here 
} 

在2級你不處理異常,你就讓它經過呼叫者。無論如何,在堆棧跟蹤中你都會得到這些信息。

我希望這會有所幫助。

0

在你的log4j配置中,你有2級中的記錄器被髮送到你的appender兩次嗎?