web-dev-qa-db-ja.com

Spring Boot-Logbackでメールを送信する

例外(ログレベル:ERROR)が発生したときに電子メールを送信するようにLogbackを構成しようとしています。これまでのところ、動作させることができませんでしたので、設定のお手伝いをお願いします。

いくつかの処理が行われるSpringブートアプリケーションがあります。

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

このエラーが記録されるたびにメールを送信したいと思います。私はいくつかの tutorials に従い、logback.xmlsmtp-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>
_

sendmailを介してlocalhostにローカルのsmtpserverをセットアップしました。 AWSのSMTPサーバーとGmailも試してみました。これまでのところ、これらのサービスはどれも機能しませんでした。

問題は、例外の後に電子メールを受信せず、ログバックに対応する出力(文字列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>
_

任意の助けをいただければ幸いです。

25
Smajl

Smtpappenderのポートのデフォルトエントリは25で、gmailはsmtpサービスに認証を使用しており、TLSにはポート587、SSLには465を使用する必要があります。

これはあなたの問題かもしれません。

最初に認証なしでローカルマシンにメールサーバーをセットアップしてみてください。次に、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>[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
user902383

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

メールのマーカーベースのトリガーを有効にする必要があります。

sMTPアペンダーの下のlogback.xmlにエバリュエーターを含めます以下のリンクを参照してください

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

次に、例外キャッチブロックに以下のロジックを追加し、以下のようなメールを送信する場合は、Markerオブジェクトをロガーメソッドに渡します-

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.error("This is a serious an error requiring the admin's attention",
   new Except
ion("Just testing"));
0
Somnath Goswami