Столкновение с проблемой в журнале ошибок log4j и обработке исключений - PullRequest
0 голосов
/ 12 февраля 2009

Я использовал 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

Но регистрируется ошибка один раз для случая ниже.

Case2:

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

Помогите мне, что я должен сделать, чтобы регистрировать ошибку только один раз в файле журнала, где бы она ни была.

Ответы [ 2 ]

3 голосов
/ 12 февраля 2009

Но регистрируется ошибка один раз для случая ниже.

Это потому, что вы обрабатываете исключение:

Class1:

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

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

Позже в классе 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 вы не обрабатываете исключение, вы просто пропускаете его через вызывающего. В любом случае, в стековой трассе у вас будет информация.

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

0 голосов
/ 12 февраля 2009

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

...