【问题标题】:Facing problem in log4j error log and exception handling面临 log4j 错误日志和异常处理中的问题
【发布时间】:2023-03-21 04:13:01
【问题描述】:

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

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

【问题讨论】:

  • Raja 请提供您在日志文件中遇到的异常的完整文本。
  • @raja:如果您之前添加 4 个空格,该网站可以自动格式化代码。看看我的编辑。
  • 我已编写代码以仅在日志文件中写下异常名称。所以它的日志记录异常名称单独在日志文件中。

标签: java logging exception-handling log4j


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    第一类:

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

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

    稍后在 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 类中,您不处理异常,只是让它通过调用者。无论如何,您都会在堆栈跟踪中获得信息。

    我希望这会有所帮助。

    【讨论】:

    • 见案例1。首先,当 class2 发生错误时,它会记录错误。在 whecontrol 进入 class1 之后,它再次记录相同的日志。所以总共记录了两次日志。我不想记录相同的错误两次。告诉我如何解决 case1 n 在 case2 中没有问题。
    • 奥斯卡给了你完全正确的答案:不要登录道具。仅在 func() 中执行。让异常从 prop() 传播到 func()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    相关资源
    最近更新 更多