面对log4j错误日志和异常处理中的问题

时间:2009-02-12 06:36:24

标签: java logging exception-handling log4j

我使用log4j使用FileAppender来调用错误日志。问题是它在以下情况下在日志文件中记录两次相同的错误

情况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

帮助我该怎么做才能在日志文件中只记录错误一次。

2 个答案:

答案 0 :(得分:3)

  

但是它为以下情况记录了错误一次。

那是因为你处理例外:

的Class1:

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

Class2:

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

在class2的catch块中(在//错误oocurs之后),你记录了异常,这是你在日志中得到的。

但是由于你只是记录异常,你告诉程序异常已经被控制或处理(这更合适)并且程序继续它流向我添加注释的行 //这里!!!!!

稍后在class1中,由于异常被处理,你的try / catch块没有任何反应,你的第二个异常永远不会被记录(正如你所料),因为它从未发生过。

如果你想看到两个日志(我认为这是不必要的)你应该像我在class2中那样重新抛出异常,并修改方法签名以标记它会抛出IOException。

这样你就会有两个日志。

更好的将是这样的:

的Class1:

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

Class2:

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

在第2课中,你不处理异常,只是让它通过调用者。在堆栈跟踪中,无论如何你都会获得信息。

我希望这会有所帮助。

答案 1 :(得分:0)

在你的log4j配置中,你是否已将Class 2中使用的记录器两次发送给你的appender?