1

我有一个独立的 java 应用程序。应用程序正在使用几个库,它由 maven 和“shade”插件管理,以创建一个包含所有依赖项的大 jar。我在将未捕获的异常记录到文件时遇到问题(应用程序在 linux 上运行)。我配置了 log4j.properties 并添加了滚动文件附加程序。它正在工作,但只要抛出异常,它就会打印在控制台上,而不是在配置的日志文件中。基本上,我以包含所有 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

目前,我使用控制台附加程序绕过了这个问题,并使用以下方法运行应用程序:

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

...但我真的很想使用滚动文件附加程序。

4

3 回答 3

4

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

    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

        @Override
        public void uncaughtException(Thread t, Throwable e) {
            logger.error("Uncaught exception", e);
        }
    });
于 2013-02-20T09:40:55.173 回答
0

作为例外,你不应该使用 e.printStackTrace() 而是使用 logger.fatal(e.getStrackTrace())。

于 2013-02-20T09:30:49.983 回答
0

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

请注意,如果(比如说)您通过 kill -3 触发线程堆栈跟踪,则会出现stderr,因此我总是会捕获stderr/out并将其写入与 log4j 文件不同的日志文件中。

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

于 2013-02-20T09:36:19.293 回答