2017-02-24 6 views
1

Je commence mon application sur le serveur Linux avec une commande commeRuntimeExceptions de capture dans l'application Java et les envoyer par e-mail

/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 

J'utilise log4j pour l'exploitation forestière dans mon application et il a sa propre configuration décrite dans log4j.properties qui se trouve à l'intérieur myapp.jar.

Je veux être en mesure d'attraper toute exception qui se passe dans l'application et de me l'envoyer par e-mail. J'ai configuré org.apache.log4j.net.SMTPAppender dans log4j.properties à cet effet.

Mais actuellement RuntimeException, comme NullPointerException sont imprimés juste à stderr qui jsvc redirige vers error.log sans appliquer log4j modèle de mise en forme.

Est-il possible ou devrais-je exécuter l'application sans jsvc wrapper comme

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

ou est-il une meilleure solution?

Répondre

0

Répondre moi-même. Il suffit de définir par défaut UncaughtExceptionHandler au début de votre point d'entrée de code

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