読者です 読者をやめる 読者になる 読者になる

文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

logbackのSMTPアペンダはバッチ実行時は非同期送信にしない方がいい

java

logbackにはSMTPアペンダがあり、
log.error()等を検出して、アラートメールを送信することができます。
メール送信には同期送信と非同期送信があり、パフォーマンス・リソース的には
当然非同期送信の方がよいです。

しかし、この非同期送信には問題があります。

This property determines whether email transmission is done asynchronously or not. By default, the asynchronousSending property is 'true'. However, under certain circumstances asynchronous sending may be inappropriate. For example if your application uses SMTPAppender to send alerts in response to a fatal error, and then exits, the relevant thread may not have the time to send the alert email. In this case, set asynchronousSending property to 'false' for synchronous email transmission.

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

要は、別スレッドはlogbackが非同期メール送信の完了を待ってくれないから、
メールが送信される前にアプリが終了しちゃう可能性があるから、
バッチのようなスタンドアロン実行する場合は非同期をオフにした方がいいよ、とのことです。
実際私はこの罠にハマリ、何故バッチの場合だけメール送信されないんだろう、
と思ったら、こういう理由なんですね。

webアプリの場合はtomcatが終了するまではそういった状況にはなりません。
ただしtomcatが終了するタイミングでアラートが送信された場合、
同じ理由でメール送信が間に合わない可能性はあります。

結果的に、batchプロジェクトの場合は以下の設定でいくといいかと思います。

<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <smtpHost>${smtpHost}</smtpHost>
    <smtpPort>${smtpPort}</smtpPort>
    <from>${from}</from>
    <to>${to}</to>
    <subject>${HOSTNAME} - %m</subject>
    <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>[%-5level][%d{yyyy-MM-dd HH:mm:ss.SSS}] %class - %msg%n</Pattern>
    </layout>

    <asynchronousSending>false</asynchronousSending>

    <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
        <bufferSize>512</bufferSize>
    </cyclicBufferTracker>
</appender>

<root>
    <level value="INFO" />
    <appender-ref ref="EMAIL" />
</root>


jspで発生したエラーをlogbackでアラートメール送信する手順をまとめました!
↓↓↓↓ こちらです ↓↓↓↓↓

現場で使えるJavaライブラリ

現場で使えるJavaライブラリ

Log4J

Log4J