Logging 捕获Java应用程序中的运行时异常并通过电子邮件发送

Logging 捕获Java应用程序中的运行时异常并通过电子邮件发送,logging,log4j,daemon,runtimeexception,jsvc,Logging,Log4j,Daemon,Runtimeexception,Jsvc,我在Linux服务器上用这样的命令启动我的应用程序 /usr/local/bin/jsvc \ -home /usr/local/jdk1.8.0_111 \ -cp /opt/myapp/myapp.jar:/opt/myapp/lib/* \ -user myappuser \ -outfile /opt/myapp/out.log \ -errfile /opt/myapp/error.log \ -pidfile /opt/myapp/my

我在Linux服务器上用这样的命令启动我的应用程序

/usr/local/bin/jsvc \
    -home /usr/local/jdk1.8.0_111 \
    -cp /opt/myapp/myapp.jar:/opt/myapp/lib/* \
    -user myappuser \
    -outfile /opt/myapp/out.log \
    -errfile /opt/myapp/error.log \
    -pidfile /opt/myapp/myapp.pid \
    com.example.MyApp
我正在使用
log4j
登录我的应用程序,它有自己的配置,如
log4j.properties
中所述,它位于
myapp.jar

我希望能够捕捉到应用程序中发生的任何异常,并通过电子邮件发送给我。为此,我在
log4j.properties
中配置了
org.apache.log4j.net.SMTPAppender

但是目前
RuntimeException
,比如
NullPointerException
只是打印到
stderr
,而
jsvc
重定向到
error.log
,而不应用
log4j
格式模式

我是否可以或者应该在不使用jsvc的情况下运行应用程序

nohup java -jar /opt/myapp/myapp.jar &

还是有更好的解决办法?

回答我自己。只需在代码入口点的开头设置默认值

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class App {

    private static final Logger logger = LoggerFactory.getLogger(App.class);

    public static void main(String[] args) {
        Thread.setDefaultUncaughtExceptionHandler((t, e) -> logger.error(null, e));
    }

}
log4j.属性

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/opt/myapp/myapp.log
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %m%n

# SMTP 
log4j.appender.email=org.apache.log4j.net.SMTPAppender
log4j.appender.email.SMTPHost=yoursmtp.example.com
log4j.appender.email.SMTPUsername=youuser@yoursmtp.example.com
log4j.appender.email.SMTPPassword=yourpassword
log4j.appender.email.From=youuser@yoursmtp.example.com
log4j.appender.email.To=youremail@example.com
log4j.appender.email.Subject=An error has happened
log4j.appender.email.BufferSize=1
log4j.appender.email.layout=org.apache.log4j.PatternLayout
log4j.appender.email.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1}:%L - %m%n
log4j.appender.email.Threshold = ERROR