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

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

我有一个独立的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
目前,我使用console appender绕过了该问题,并使用以下方法运行应用程序:

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

…但我真的很想使用滚动文件追加器

对于例外情况,不应使用e.printStackTrace()
但是logger.fatal(e.getStrackTrace())。

对于例外情况,不应使用e.printStackTrace() 但是logger.fatal(e.getStrackTrace())。

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

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

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

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

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


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

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

Thread.setDefaultUncaughtExceptionHandler(新的Thread.UncaughtExceptionHandler(){
@凌驾
公共无效未捕获异常(线程t,可丢弃的e){
记录器错误(“未捕获异常”,e);
}
});

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

Thread.setDefaultUncaughtExceptionHandler(新的Thread.UncaughtExceptionHandler(){
@凌驾
公共无效未捕获异常(线程t,可丢弃的e){
记录器错误(“未捕获异常”,e);
}
});

我知道这一点。从第三方库引发异常。是否尝试对该库进行捕获调用?因此,我知道,例外情况并非一直存在。从第三方库引发异常。是否尝试对该库进行捕获调用?因此,例外情况不会一直上升