gpt4 book ai didi

java - log4j错误日志中面临的问题和异常处理

转载 作者:行者123 更新时间:2023-12-02 00:55:55 30 4
gpt4 key购买 nike

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

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

最佳答案

But its logging the error one time for the below case.

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

第一类:

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

第二类:

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

在 class2 的 catch block 中(在//error 发生在这里之后),您记录了异常,这就是您在日志中得到的内容。

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

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

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

这样你就会有两个日志。

更好的是这样的:

第一类:

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

第二类:

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

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

我希望这会有所帮助。

关于java - log4j错误日志中面临的问题和异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/540282/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com