Javaのログライブラリ「Logback」からSendGridでメールを送る
- 2020年8月18日
- by SendGrid
- Category: 技術ネタ
Javaのログ出力には色々な選択肢があります。なかでもよく使われるのは、SLF4JとLogbackを組み合わせる方法です。SLF4JでAPIを共通化して、Logbackで出力することでログの処理を柔軟に制御できます。
LogbackのAppenderを使うと、コードに手を入れることなく、ログの出力先を自由に追加できます。出力先はコンソールやファイルの他、メールにも対応しています。実際のシステムではログサービスを用意して、そこからメールを送るのが一般的ですが、スタンドアロンのプログラムや小さなシステムではライブラリから直接メールを送るほうが楽なときもあります。
どんな風に使うのかSendGridを利用して試してみましょう。
用意するもの
動作確認に必要なものは次のとおりです。
- SendGridアカウント(Freeプランで問題ありません)
- Javaの開発環境
- JDK(Java Development Kit)
- 統合開発環境(IDE)
- ビルドツール
今回の記事は以下の環境で試しました。
- Windows 10 Pro(1909)
- AdoptOpenJDK 11
- Visual Studio Code 1.47.3
※拡張機能「Java Extension Pack」を利用 - Maven 3.6.2
作成したソースコードはこちらです。
プロジェクトの準備
ライブラリは次の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に指定した形式どおりに標準出力されたら成功です。
続いて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); } }
受信したメールの確認
プログラムを実行して、受信したメールにログの内容が書き込まれていれば成功です。
こんな感じでメールによるログ通知を簡単に実現できます。ぜひ試してみてください。