2017-02-24 45 views
1

給他們,我開始我的Linux服務器上的應用程序,像這樣捕捉RuntimeExceptions,並通過電子郵件

/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 & 

還是有更好的解決辦法?

回答

0

回答我自己。只需設置默認UncaughtExceptionHandler你的代碼入口點開始

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.properties

# 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 
[email protected] 
log4j.appender.email.SMTPPassword=yourpassword 
[email protected] 
[email protected] 
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