Spring启动 - 使用Logback发送电子邮件

时间:2015-09-01 09:35:15

标签: java logging spring-boot

我正在尝试将Logback配置为每当发生异常(日志级别:错误)时发送电子邮件。到目前为止,我还没能使它工作,所以我想请求你的配置帮助。

我有一个Spring启动应用程序,其中进行了一些处理:

private void foo() {
 try {
  // do something
 } catch (Exception e) {
  log.error("Logging my exception");
 }
}

我想在记录此错误时触发电子邮件。我关注了一些tutorials,并将 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>test@email.com</to>
        <from>me@email.com</from>
        <subject>testError</subject>

        <layout class="ch.qos.logback.classic.html.HTMLLayout" />

    </appender>
</included>

我已通过sendmail在localhost上设置了本地smtpserver。我也尝试过使用AWS smtp服务器和Gmail。到目前为止,这些服务都不适合我。

问题是我在异常之后没有收到任何电子邮件,并且实际上没有对应于logback的输出(当然除log.error()输出之外)这让我认为应用程序甚至不知道关于这些配置文件......

这些是我在 pom.xml 中的maven依赖项:

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

任何帮助都将受到高度赞赏。

3 个答案:

答案 0 :(得分:3)

smtpappender中端口的默认条目是25,gmail正在对smtp服务使用身份验证,您需要将端口587用于TLS,将465用于SSL。

我想说这可能是你的问题。

尝试在未经身份验证的情况下首先在本地计算机上设置邮件服务器,然后尝试附加的工作。然后尝试找到如何为gmail配置它。

来自第http://logback.qos.ch/manual/appenders.html#gmailSTARTTLS

适用于Gmail的SMTPAppender(STARTTLS)

<configuration>   
  <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
    <smtpHost>smtp.gmail.com</smtpHost>
    <smtpPort>587</smtpPort>
    <STARTTLS>true</STARTTLS>
    <username>YOUR_USERNAME@gmail.com</username>
    <password>YOUR_GMAIL_xPASSWORD</password>

    <to>EMAIL-DESTINATION</to>
    <to>ANOTHER_EMAIL_DESTINATION</to> <!-- additional destinations are possible -->
    <from>YOUR_USERNAME@gmail.com</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>

答案 1 :(得分:3)

请在pom.xml&amp;上包含以下内容(来自我的工作项目)。 logback.xml以获取错误邮件: -

<强>的pom.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>me@gmail.com</from>
      <to>you@gmail.com</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>

<强> logback.xml

index.php

答案 2 :(得分:0)

您必须启用基于标记的电子邮件触发。

在SMTP appender下的logback.xml中包含一个评估程序  请参阅以下链接

http://logback.qos.ch/manual/appenders.html#OnMarkerEvaluator

然后在您的Exception catch块中添加以下逻辑,如果您想发送如下所示的电子邮件,请将Marker对象传递给logger方法 -

Marker notifyAdmin = MarkerFactory.getMarker("NOTIFY_ADMIN");
logger.error(notifyAdmin,
  "This is a serious an error requiring the admin's attention",
   new Except
ion("Just testing"));

可能在某些情况下你不想发送电子邮件而只想记录异常,然后就不要将Marker对象传递给logger方法。

logger.error("This is a serious an error requiring the admin's attention",
   new Except
ion("Just testing"));