Я использую 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
Я не использовал вызов 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));
Используя ваш пример кода:
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 {
Я не вижу ничего плохого в вашей конфигурации, поэтому попробуйте обновить log4j
до более новой (не обязательно последней) версии .
Хотя в данном случае это не проблема, вам лучше сделать ваши логгеры private static final
То, что вы опубликовали, должно отображать трассировку стека, как указано в javadoc.
Обратите внимание, что если вы не включите сообщение (и просто вызовете logger.error(ex)
), то трассировка стека не будет записана.