Javaのログライブラリ「Logback」からSendGridでメールを送る

Javaのログライブラリ「Logback」からSendGridでメールを送る

Javaのログ出力には色々な選択肢があります。なかでもよく使われるのは、SLF4JLogbackを組み合わせる方法です。SLF4JでAPIを共通化して、Logbackで出力することでログの処理を柔軟に制御できます。

LogbackのAppenderを使うと、コードに手を入れることなく、ログの出力先を自由に追加できます。出力先はコンソールやファイルの他、メールにも対応しています。実際のシステムではログサービスを用意して、そこからメールを送るのが一般的ですが、スタンドアロンのプログラムや小さなシステムではライブラリから直接メールを送るほうが楽なときもあります。

どんな風に使うのかSendGridを利用して試してみましょう。

用意するもの

動作確認に必要なものは次のとおりです。

今回の記事は以下の環境で試しました。

作成したソースコードはこちらです。

プロジェクトの準備

ライブラリは次の3つを使います。

  • ログ出力「SLF4J」「Logback」
  • メール送信「JavaMail

Mavenのpom.xmlは次のとおりです。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
     <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

Logback.xmlの準備

Logbackの設定ファイル「Logback.xml」を作成して、main/resources配下に配置します。設定ファイルが正しく読み込めているかどうかを確認するため、最初は標準出力で試すのがおすすめです。%msgの部分にコードで指定した内容が書き込まれます。

<configuration debug="true">
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>ログだよ - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="ERROR">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

ログ出力

次のようなプログラムを書いて実行します。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Logbackのサンプルコード
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        Logger logger = LoggerFactory.getLogger(App.class);
        logger.error("エラーだよ");
    }
}

patternに指定した形式どおりに標準出力されたら成功です。

patternに指定した形式どおりに標準出力されたら成功

続いてSMTPAppenderを追加します。

SMTPAppender

Logback.xmlにSMTPAppenderの定義を追加します。コードに手を入れることなく出力先を追加できます。

<configuration debug="true">

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>ログだよ - %msg%n</pattern>
    </encoder>
  </appender>

   <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
    <smtpHost>smtp.sendgrid.net</smtpHost>
    <smtpPort>587</smtpPort>
    <SSL>true</SSL>
    <username>apikey</username>
    <password>SG.xxx</password>

   <to>to@example.com</to>
    <from>from@example.com</from>
    <subject>LogbackのSMTPAppenderで送信</subject>

    <!-- trueの場合、サンプルコード内でsleep処理が必要  -->
    <asynchronousSending>false</asynchronousSending>

    <layout class="ch.qos.logback.classic.PatternLayout">
      <pattern>ログをメールで通知するよ↓%n%n%m%n</pattern>
    </layout>
  </appender>

  <root level="ERROR">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="EMAIL" />
  </root>
</configuration>

SendGridのAPIキーを発行して、usernameに「apikey」、passwordにAPIキーを設定します。toの宛先には手元で確認可能なメールアドレスを指定してください。

asynchronousSendingはデフォルトがtrueなので、サンプルコードを実行する際はfalseを指定してください。trueのままだとメールを送る前にmainの処理が終了してしまうので、その場合は次のようなスリープ処理が必要です。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Logbackのサンプルコード
 *
 */
public class App 
{
    public static void main( String[] args ) throws InterruptedException
    {
        System.out.println( "Hello World!" );

        Logger logger = LoggerFactory.getLogger(App.class);
        logger.error("エラーだよ");

        //sleepを追加
        Thread.sleep(10000);
    }
}

受信したメールの確認

プログラムを実行して、受信したメールにログの内容が書き込まれていれば成功です。

受信メール

こんな感じでメールによるログ通知を簡単に実現できます。ぜひ試してみてください。

メールを成功の原動力に

開発者にもマーケターにも信頼されているメールサービスを利用して、
時間の節約、スケーラビリティ、メール配信に関する専門知識を手に入れましょう。