Java独立应用程序日志记录异常(log4j)

时间:2013-02-20 09:29:04

标签: java logging log4j

我有一个独立的java应用程序。应用程序使用几个库,它由maven和'shade'插件管理,以创建具有所有依赖项的一个大jar。将未捕获的异常记录到文件中时遇到问题(应用程序在linux上运行)。我配置了log4j.properties并添加了滚动文件appender。它正在工作,但每当抛出异常时,它都会打印在控制台而不是配置的日志文件中。基本上我以包含所有INFO +条目的日志文件结束,但没有例外(未捕获)。

这是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。

3 个答案:

答案 0 :(得分:4)

找到解决此类问题的方法。 这很容易。您需要在'main'类中添加DefaultUncaughtExceptionHandler。 这是片段:

    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

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

答案 1 :(得分:0)

对于异常,您不应该使用e.printStackTrace() 但是logger.fatal(e.getStrackTrace())。

答案 2 :(得分:0)

如果异常未被捕获,则log4j根本不会记录它们。所以我认为重定向非常有用,无论如何。

注意,如果(比方说)你通过kill -3触发线程堆栈跟踪,那么 stderr,因此我总是会抓住stderr / { {1}}并将其写入与log4j文件不同的日志文件中。

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