我使用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
帮助我该怎么做才能在日志文件中只记录错误一次。
答案 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?