Q3:任意のレベルのログが発生した場合にメールを送信するには?

まず以下のように org.apache.log4j.spi.TriggeringEventEvaluator インタフェースを実装したクラスを作成します。

public class SampleEvaluator implements TriggeringEventEvaluator {
    /**
     * INFOレベルのみメール送信対象とする。
     */
    public boolean isTriggeringEvent(LoggingEvent event) {
        if (event.getLevel().toInt() == Level.INFO.toInt()) return true;
        else return false;
    }
}

引数のログイベントがメール送信対象とするログレベルかどうかをチェックし、対象レベルであれば true を返すよう isTriggeringEvent() メソッドを、実装します。上の例では INFO レベルのみを対象としています。

次に上のクラスをログレベルの評価クラスとして使用させるために、設定ファイルにそのための記述を加えます。具体的には、 SMTPAppender に EvaluatorClass パラメータを追加し、その値に上のクラス名を与えます。最後に BufferSize パラメータの値を 1 にすることによって INFO レベルのみが送信対象となります。

  <appender name="SMTP" class="org.apache.log4j.net.SMTPAppender">
    <param name="BufferSize" value="1" />
    <param name="To" value="宛先アドレス" />
    <param name="From" value="送信元アドレス" />
    <param name="Subject" value="メールタイトル" />
    <param name="SMTPHost" value="SMTPサーバのIPアドレス" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern"
        value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </layout>
    <param name="EvaluatorClass" value="logtest.p1.SampleEvaluator" />
  </appender>

これによって INFO レベルのみメール送信させることが可能です。

注意する点は、TriggeringEventEvaluator#isTriggeringEvent() メソッドでは、メール送信のキックとなるログレベルを定義しているだけであり、例えば logger のレベルが DEBUG ならば、INFO 以外のログイベントが発生すると、バッファに格納されるということです。例えば DEBUG → WARN → INFO とログイベントが発生した場合、DEBUG, WARN のログイベントがバッファへ格納され、INFO ログイベントの発生で、バッファ内の2つのイベントもメールに含まれることになります。

上の例ではそれを防ぐために、BufferSize パラメータの値を 1 にし、バッファへ余分なログイベントが格納されることを防ぐことによって特定レベルのみ送信させるようにしています。


トップページへ戻る