Spring загрузка - отправка писем с помощью журнала
Я пытаюсь настроить Logback на отправку писем всякий раз, когда возникает исключение (уровень ведения журнала: ERROR). Я не смог заставить его работать до сих пор, поэтому я хотел бы попросить о вашей помощи с настройкой.
У меня есть приложение загрузки Spring, где выполняется некоторая обработка:
private void foo() {
try {
// do something
} catch (Exception e) {
log.error("Logging my exception");
}
}
Я бы хотел вызвать электронное письмо всякий раз, когда эта ошибка регистрируется. Я выполнил несколько учебных пособий и добавил logback.xml и smtp-appender.xml в каталог resources
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<include resource="smtp-appender.xml" />
<logger name="com.mycompany" level="DEBUG">
<appender-ref ref="SMTP" />
</logger>
</configuration>
SMTP-appender.xml
<?xml version="1.0" encoding="UTF-8"?>
<included>
<appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>xxx</smtpHost>
<username>user</username>
<password>password</password>
<to>[email protected]</to>
<from>[email protected]</from>
<subject>testError</subject>
<layout class="ch.qos.logback.classic.html.HTMLLayout" />
</appender>
</included>
Я установил локальный smtpserver на localhost через sendmail
. Я также пробовал с сервером AWS smtp и Gmail. Ни одна из этих служб не работала для меня до сих пор.
Проблема в том, что я не получаю никаких сообщений по электронной почте после исключения, и буквально нет выхода, соответствующего журналу (кроме вывода log.error()
, конечно), что заставляет меня думать, что приложение даже не знает об этих файлы конфигурации...
Это мои зависимости maven в pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.5.RELEASE</version>
<relativePath />
<!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20141113</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
Любая помощь будет высоко оценена.
Ответы
Ответ 1
Pls включает следующее (из моего рабочего проекта) на pom.xml и logback.xml, чтобы получить сообщение об ошибке: -
pom.xml
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="errMailer" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>xxx</smtpHost>
<smtpPort>25</smtpPort>
<from>[email protected]</from>
<to>[email protected]</to>
<subjectStr>App Err Mail</subjectStr>
<layout class="ch.qos.logback.classic.html.HTMLLayout"/>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<root level="ERROR">
<appender-ref ref="errMailer" />
</root>
</configuration>
Ответ 2
Запись по умолчанию для порта в smtpappender равна 25, gmail использует аутентификацию для служб smtp, и вам нужно использовать порты 587 для TLS и 465 для SSL.
Я бы сказал, что это может быть вашей проблемой.
Сначала попробуйте настроить почтовый сервер на своем локальном компьютере без проверки подлинности, и попробуйте выполнить прилагаемые работы. затем попробуйте найти, как настроить его для gmail.
Со страницы http://logback.qos.ch/manual/appenders.html#gmailSTARTTLS
SMTPAppender для Gmail (STARTTLS)
<configuration>
<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>smtp.gmail.com</smtpHost>
<smtpPort>587</smtpPort>
<STARTTLS>true</STARTTLS>
<username>[email protected]</username>
<password>YOUR_GMAIL_xPASSWORD</password>
<to>EMAIL-DESTINATION</to>
<to>ANOTHER_EMAIL_DESTINATION</to> <!-- additional destinations are possible -->
<from>[email protected]</from>
<subject>TESTING: %logger{20} - %m</subject>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%date %-5level %logger - %message%n</pattern>
</layout>
</appender>
<root level="DEBUG">
<appender-ref ref="EMAIL" />
</root>
</configuration>
Ответ 3
Вам нужно включить запуск электронной почты на основе Marker.
включить оценщика в ваш logback.xml под SMTP appender
см. ссылку
http://logback.qos.ch/manual/appenders.html#OnMarkerEvaluator
затем добавьте ниже логику в свой блок catch Exception, передайте объект Marker методу logger, если вы хотите отправить электронную почту, как показано ниже -
Marker notifyAdmin = MarkerFactory.getMarker("NOTIFY_ADMIN");
logger.error(notifyAdmin,
"This is a serious an error requiring the admin attention",
new Except
ion("Just testing"));
возможно, что в каком-то сценарии вы не хотите отправлять электронную почту и хотите только регистрировать исключение, а просто не передавайте объект Marker методу регистрации.
logger.error("This is a serious an error requiring the admin attention",
new Except
ion("Just testing"));