2013-02-20 2 views
1

У меня есть автономное приложение Java. Приложение использует пару библиотек и управляется плагином maven и 'shade' для создания одного большого банкета со всеми зависимостями. У меня возникла проблема с протоколированием исключенных исключений в файл (приложение запускается в linux). Я настроил log4j.properties и добавил скопированный файл appender. Он работает, но всякий раз, когда вызывается исключение, оно печатается на консоли, а не в файле конфигурации. В основном я заканчиваю файл журнала со всеми записями INFO +, но никаких исключений (неотображаемых).Исключения для автономной регистрации Java (log4j)

Вот это log4j.properties:

# Root logger option 
log4j.rootLogger=INFO, file 

# Direct log messages to a log file 
log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=logs/my-app.log 
log4j.appender.file.MaxFileSize=100MB 
log4j.appender.file.MaxBackupIndex=10 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 

Я запущенное приложение с помощью:

java -jar -Dlog4j.configuration=file:log4j.properties myApp.jar 

В настоящее время я обошел эту проблему с помощью консоли Appender и запуска приложения с помощью:

java -jar -Dlog4j.configuration=file:log4j.properties myApp.jar >> logs/my-app.log 2>&1 

... но я бы действительно хотел использовать скопированный файл appender.

ответ

0

Для исключения вам не следует использовать e.printStackTrace() , но logger.fatal (e.getStrackTrace()).

+0

Я знаю это. Исключение выбрасывается из третьей стороны lib. – szymon

+0

попробуйте поймать звонки в lib? Таким образом, исключение не проходит полностью – Julien

0

Если за исключением неотображаемых, то они не будут регистрироваться log4j вообще. Поэтому я думаю, что перенаправление очень полезно, независимо.

Обратите внимание, что если (скажем) вы вызвать стека потока трассировки через убийство -3, что выходит на stderr и, следовательно, я всегда буду ловить stderr/out и записать его в лог-файл, отличный от файла log4j ,

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

4

Обнаружено решение проблемы. Это довольно легко. Вам нужно добавить DefaultUncaughtExceptionHandler в ваш основной класс. Это фрагмент:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 

     @Override 
     public void uncaughtException(Thread t, Throwable e) { 
      logger.error("Uncaught exception", e); 
     } 
    }); 
Смежные вопросы