Поймать исключения RuntimeException в приложении Java и отправить их по электронной почте

Я запускаю свое приложение на сервере 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,

Я хочу быть в состоянии поймать любое исключение, которое происходит в приложении, и отправить его мне по электронной почте. Я настроил org.apache.log4j.net.SMTPAppender в log4j.properties для этой цели.

Но в настоящее время RuntimeException, лайк NullPointerException только что напечатаны stderr который jsvc перенаправляет на error.log без применения log4j шаблон форматирования.

Это возможно или я должен запустить приложение без jsvc как обертка

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

или есть лучшее решение?

1 ответ

Отвечаю сам. Просто установите 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
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
Другие вопросы по тегам