2009-02-12 3 views
0

Я использовал log4j для журнала ошибок looging с помощью FileAppender. Проблема заключается в ее регистрации в ту же ошибку два раза в лог-файл, когда ниже ситуацииОблицовка проблемы в журнале ошибок log4j и обработке исключений

Вариант 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

Raja, пожалуйста, предоставьте полный текст для исключения, которое вы получаете в файле журнала. –

+0

@raja: сайт может автоматически форматировать код, если вы добавите 4 пробела раньше. Посмотрите на мое редактирование. – OscarRyz

+0

Я закодировал для записи только имя исключения в файле журнала. Таким образом, его имя исключения журнала только в файле журнала. – raja

ответ

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 (после того, как ваш // error oocurs здесь) вы регистрируете исключение, вот что у вас есть на ваших журналах.

Но поскольку вы просто регистрируете исключение, вы сообщаете программе, что исключение управляется каким-то образом или обрабатывается (что более подходит), и программа продолжает поток к строке, где я добавил комментарий // Вот!!!!!

Позже в классе1, поскольку обработано исключение, в вашем блоке try/catch ничего не происходит, и ваше второе исключение никогда не регистрируется (как вы ожидали), потому что этого не произошло.

Если вы хотите увидеть два журнала (что, по моему мнению, это необязательно), вы должны перебросить исключение, как это было в вашем классе2 и плюс, изменить подпись метода, чтобы указать, что это генерирует исключение 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 не обрабатывает исключение, вы просто отпустить ее через вызывающий абонент. В stacktrace у вас будет информация в любом случае.

Надеюсь, это поможет.

+0

См. Корпус1. Сначала он регистрирует ошибку при возникновении ошибки в классе2. После того, как whecontrol переходит к классу 1, он снова регистрирует тот же журнал снова. Таким образом, регистрируется всего два раза. Я не хочу регистрировать одну и ту же ошибку дважды. Скажите мне, как разрешить case1 n не проблема в case2. – raja

+0

Оскар дал вам правильный ответ: не заходите в опору. Делайте это только в func(). Пусть исключение распространяется только от prop() до func(). –

0

В вашей конфигурации log4j у вас есть регистратор, используемый в классе 2, который дважды отправляется в ваш аккаунт?

Смежные вопросы