三ツ星★★★人生

勢いで会社を辞めた元女SEのその後

Webシステムのエラーを自動検知してメール通知する方法

slf4j + logback によるエラー検知&メール通知の設定方法をご紹介します。

開発環境はEclipse(Kepler Service Release 2)を使ってます。

①必要なjarを追加

~以下のjarをクラスパス上に追加する手順~

slf4j-api
jcl-over-slf4j
slf4j-log4j12
log4j
logback-ext-spring
logback-core
logback-classic
lmail
activation.jar 
janino.jar

 

手順1:pom.xmlに下記を追記

書き方がわからなかったら、http://mvnrepository.com/で検索→コピペで!

pom.xml(抜粋)
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>

 

手順2:jarを取得

プロジェクトを右クリック→Maven>プロジェクトの更新

→「pom.xmlからプロジェクト構成を更新」にチェックを入れる

→OK

 

<確認方法>

Javaリソース>ライブラリ>Maven依存関係

→jarが追加されていることを確認

 

(例)
logback-core-1.1.2.jar
logback-classic-1.1.2.jar
logback-ext-spring-0.1.2.jar

 

logback.xmlを作成してWEB-INFの下に配置

logback.xml

<configuration>
<!-- メール通知 -->
<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
<bufferSize>512</bufferSize>
<smtpHost>smtp.gmail.com</smtpHost>
<smtpPort>465</smtpPort>
<SSL>true</SSL>
<username>メールアドレス</username>
<password>↑のアカウントのパスワード</password>
<to>送信先アドレス</to>
<from>送信元アドレス</from>
<subject>[WR]ERROR OCCURED: %logger{20} - %m</subject>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%date %-5level %logger{35} - %message%n</pattern>
</layout>
</appender>

<!-- コンソール出力 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
<![CDATA[date:%d{yyyy-MM-dd HH:mm:ss}\tthread:%thread\tX-Track:%X{X-Track}\tlevel:%-5level\tlogger:%-48logger{48}\tmessage:%msg%n]]>
</pattern>
</encoder>
</appender>

<!-- ファイル出力 -->
<appender name="APPLICATION_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>log/projectName-application.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/tomcat7/warn-%d{yyyyMMddHH}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<pattern>
<![CDATA[date:%d{yyyy-MM-dd HH:mm:ss}\tthread:%thread\tX-Track:%X{X-Track}\tlevel:%-5level\tlogger:%-48logger{48}\tmessage:%msg%n]]>
</pattern>
</encoder>
</appender>

<root level="warn">
<appender-ref ref="EMAIL" />
<appender-ref ref="STDOUT" />
<appender-ref ref="APPLICATION_LOG_FILE" />
</root>

<!-- 3rdparty Loggers -->
<logger name="org.springframework">
<level value="warn" />
</logger>
<logger name="org.springframework.web.servlet">
<level value="info" />
</logger>
</configuration>

 

②web.xmllogback.xmlのパスを追記

※contextConfigLocationより上に記載しないと読み込まれないので注意!!

こんな感じ。

 

web.xml(抜粋)

<context-param>

<param-name>logbackConfigLocation</param-name>
<param-value>/WEB-INF/logback.xml</param-value>
</context-param>
<listener>
<listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
</listener>

 

③アプリ内のログを出力したい場所にロガーをセット

TestLogger.java

public class TestLogger {

/** ログ出力用のインスタンス */
private static final Logger LOGGER = LoggerFactory.getLogger(TestLogger.class);
LOGGER.warn("warn occured!!!");
LOGGER.error("error occured!!!");

}

 

以上!思ったより簡単でした!

 

 

~注意点!!~

・エラーはたくさん起きているのにメールは最後の1件しか届かない場合

→バッチ系のアプリではこういうことが起こるようです。

logbackのメール通知のところに、下記を追記すれば直ります。

logback.xml(抜粋)

<configuration>
<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
・・・
<asynchronousSending>false</asynchronousSending>
・・・
</appender>

たまにはと思い、SEっぽい話もしてみました(笑)