Преобразуйте e.printStackTrace(), чтобы вместо этого использовать log4j.

Я очень новичок в log4j. Я не хочу показывать трассировку стека исключений в моем файле журнала, например

java.lang.IllegalArgumentException: nodeRef is a mandatory parameter
at org.alfresco.util.ParameterCheck.mandatory(ParameterCheck.java:42)

Эти исключения записываются непосредственно в консоль с помощью e.printStackTrace() вот так

try {
    // something
} catch(Exception e) {
    StringWriter stack = new StringWriter();
    e.printStackTrace(new PrintWriter(stack));
    logger.debug("Caught exception; decorating with appropriate status template : " + stack.toString());
}

Сейчас я настраиваю проект с открытым исходным кодом, а не пишу все свои программы один. Таким образом, невозможно удалить e.printStackTrace(); во всех java-файлах.

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

Как настроить log4j так, чтобы он не печатал только трассировку стека исключений, а отображал другую информацию? Есть ли способ решить эту проблему?


person swemon    schedule 30.08.2012    source источник
comment
Сначала вам нужно использовать log4j. Оператор catch, который вы показываете, а) не использует log4j; б) даже нигде ничего не печатает. Он просто заполняет StringWriter трассировкой стека.   -  person Marko Topolnik    schedule 30.08.2012
comment
Я изменил свой код. В моем примере используются как e.printStackTrace(), так и logger.debug(). Это написано не мной. В моем проекте используется тот файл jar, прикрепленный источник которого показан так.   -  person swemon    schedule 30.08.2012
comment
Что бы я сделал, так это создал PrintStream для замены System.err, который записывает все, что получает, в log4j. Таким образом, вы можете использовать System.out или System.err так, как вам нравится, и на самом деле он использует log4j. ;)   -  person Peter Lawrey    schedule 30.08.2012


Ответы (2)


Код

StringWriter stack = new StringWriter();
e.printStackTrace(new PrintWriter(stack));
logger.debug("Caught exception; decorating with appropriate status template : " + stack.toString());

это просто пример неправильного использования API Log4j. Но, если вы застряли с этим, вам нечего будет делать, кроме как поднять уровень журнала выше debug и пропустить все сообщение.

Возможно существует способ урезать все сообщения журнала, что несколько облегчит вашу проблему.

person Marko Topolnik    schedule 30.08.2012
comment
Ага. Потому что мы уже использовали logger.debug(). Я думаю, нам не нужно использовать e.printStackTrace(new PrintWriter(stack)); Но источник уже используется как этот. - person swemon; 30.08.2012
comment
Я не думаю, что вы копаете этот код. Здесь нет ничего лишнего; printStackTrace в вашем примере на самом деле ничего не печатает. Программист просто хотел, чтобы трассировка стека была добавлена ​​к сообщению журнала debug, где Log4J не поддерживает log.debug(msg, exc) --- и на это есть веские причины. - person Marko Topolnik; 30.08.2012

Использовать Logger#error

import org.apache.log4j.Logger;

...

Logger log = Logger.getLogger(Locomotive.class);
log.error("your message", exc);

...
person ollins    schedule 30.08.2012