log4j, не печатающий stacktrace для исключений

Я использую log4j с котом. Когда я регистрирую исключения в своем JSPs, сервлетах:

private Logger _log = Logger.getLogger(this.getClass());
...
try{...} catch (Exception e) {
    _log.error("Error refreshing all prices", e);
}

Я только получаю первую строку исключения без stacktrace.

17 февраля 17:37:45 ОШИБКИ AutoContrib:175 - Исключение при публикации файла CSV: java.lang. ArrayIndexOutOfBoundsException

Не очень полезный вообще!

Мой log4j.properties файл (/tomcat/common/classes/log4j.properties) похож на это:

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{dd-MMM HH:mm:ss} %5p %c{1}:%L - %m%n
log4j.appender.stdout.threshold=info

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.maxFileSize=5000KB
log4j.appender.file.maxBackupIndex=10
log4j.appender.file.File=${catalina.home}/logs/web.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{dd-MMM HH:mm:ss} %5p %c{1}:%L - %m%n
log4j.appender.file.threshold=info

log4j.rootLogger=debug, stdout, file
67
задан Raedwald 5 July 2013 в 09:37
поделиться

4 ответа

Я не использовал вызов fillStackTrace, поэтому не могу прокомментировать, будет ли это работать. Другой подход заключается в использовании небольшого метода, который возвращает форматированный текст исключения.

public static String getStackTrace(Exception e)
{
    StringWriter sWriter = new StringWriter();
    PrintWriter pWriter = new PrintWriter(sWriter);
    e.printStackTrace(pWriter);
    return sWriter.toString();
}

В вашем коде логирования можно написать:

logger.error("An exception occurred: " + Utils.getStackTrace(e));
1
ответ дан 24 November 2019 в 14:38
поделиться

Используя ваш пример кода:

private static final Logger _log = Logger.getLogger(MyClass.class);
...
try{...} catch (Exception e) {
    //Change
    //_log.error("Error refreshing all prices", e);

   //To
    _log.error("Error refreshing all prices", e.fillInStackTrace());
}

Вы увидите, как отображается вся трассировка стека.

PS. Сделайте Logger синглтоном... (проверьте мою декларацию) сразу после объявления public class MyClass {

-1
ответ дан 24 November 2019 в 14:38
поделиться

Я не вижу ничего плохого в вашей конфигурации, поэтому попробуйте обновить log4j до более новой (не обязательно последней) версии .

Хотя в данном случае это не проблема, вам лучше сделать ваши логгеры private static final

1
ответ дан 24 November 2019 в 14:38
поделиться

То, что вы опубликовали, должно отображать трассировку стека, как указано в javadoc.

Обратите внимание, что если вы не включите сообщение (и просто вызовете logger.error(ex)), то трассировка стека не будет записана.

22
ответ дан 24 November 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: