Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: swemonОтветов: 2

Я очень новичок в 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 так, чтобы он не печатал только трассировку стека исключений, а отображал другую информацию? Есть ли способ решить эту проблему?

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

javalog4j

Ответы

Ответ 1 · рейтинг 8 · Marko Topolnik

Код

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

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

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

Ответ 2 · рейтинг 8 · ollins

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

import org.apache.log4j.Logger;

...

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

...

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы