2013-02-20 111 views
1

我有一个独立的java应用程序。应用程序使用了两个库,它由maven和'shade'插件管理,以创建具有所有依赖关系的一个大型jar文件。将未捕获的异常记录到文件中有问题(应用程序在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 >> logs/my-app.log 2>&1 

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

目前我使用控制台的appender和运行的应用程序使用绕过问题...但我真的想使用滚动文件appender。

回答

0

对于异常情况,您不应使用e.printStackTrace() ,而应使用logger.fatal(e.getStrackTrace())。

+0

我知道这一点。异常是从第三方库引发的。 – szymon 2013-02-20 09:36:07

+0

尝试捕获对lib的调用?因此,这个例外不会一直持续下去 – Julien 2013-02-20 09:56:54

0

如果例外情况是未被捕获那么它们将不会被log4j记录。所以我认为重定向非常有用,无论如何。

注意,如果(说)你通过杀死-3,出来的stderr,因此我总是会赶上stderr/out,并将其写入日志文件从log4j的文件不同的触发线程堆栈跟踪。

由于您无法保证写入相同日志文件的两个进程将正确交错,因此我不会将重定向和log4j都记录到同一个日志文件中(如上所述)。

4

找到了解决此类问题的解决方案。 这很容易。你需要在你的'main'类中添加DefaultUncaughtExceptionHandler。 这里是摘录:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 

     @Override 
     public void uncaughtException(Thread t, Throwable e) { 
      logger.error("Uncaught exception", e); 
     } 
    });