0

我已经使用 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

帮助我应该怎么做才能在日志文件中只记录一次错误,无论它在哪里。

4

2 回答 2

3

但是对于以下情况,它会记录一次错误。

那是因为您正在处理异常:

第一类:

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 块中(在您的 //error oocurs here 之后)您记录异常,这就是您在日志中得到的内容。

但是由于您只是记录异常,因此您是在告诉程序该异常已被某种方式控制或处理(更合适)并且程序继续流向我添加注释的行// Here!! !!!

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

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

这样你就会有两个日志。

最好是这样的:

第一类:

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

2 类:

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

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

我希望这有帮助。

于 2009-02-12T06:44:13.267 回答
0

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

于 2009-02-12T09:46:33.560 回答