4. APPENDER2
4.1. org.apache.log4j.net.SMTPAppender クラス
SMTPAppender クラスを使用すると、ログ出力をメールに転送することができます。このクラスを使用するには、 JavaMail と JAF ( JavaBeans Activation Framework ) が必要です。それぞれ、http://java.sun.com/j2ee/ja/javamail/index.htmlとhttp://java.sun.com/beans/glasgow/jaf.htmlから入手し、 mail.jar と activation.jar をクラスパスに設定してください。
SMTPAppender オブジェクトを生成するには、次のコンストラクタを使用します。
1: SMTPAppender() 2: SMTPAppender(TriggeringEventEvaluator evaluator)
1行目のコンストラクタを使用すると、イベントレベルが ERROR または FATAL であるイベントが発生したときに、ログが出力されます。Logger クラスの error( ) メソッド、または fatal( ) メソッドが呼び出された場合にログが出力されます。
2行目のコンストラクタは、どのレベル以上のイベントが発生した時にログを出力するのかを制御する場合に使用します。このコンストラクタは引き数に org.apache.log4j.spi.TriggeringEventEvaluator インタフェースを実装したクラスから生成されたオブジェクトをとります。 TriggeringEventEvaluator の isTriggeringEvent( ) メソッドを適当に実装することにより、レベルが WARN 以上のイベントに対してでもログの出力が可能になります。次のクラスは TriggeringEventEvaluator を拡張し、レベルが DEBUG 以上のイベントに対応できるようにしたものです。
import org.apache.log4j.*; import org.apache.log4j.spi.*; class SampleEvaluator implements TriggeringEventEvaluator { public boolean isTriggeringEvent(LoggingEvent event){ return(event.getLevel().isGreaterOrEqual(Priority.DEBUG)); } }
メールの送信先や、SMTP サーバなどの設定は次表のメソッドで設定します。
メソッド | 説明 |
---|---|
setFrom( String from ) | ヘッダの「From: 」に設定される。 |
setTo( String to ) |
メールの送信先を設定する。ヘッダの「To:」に設定される。 |
setSubject( String subject ) | ヘッダの「Subject: 」に設定される。 |
setSMTPHost( String smtpHost ) |
SMTPサーバの名前が設定される。 |
setBufferSize( int bufferSize ) | バッファに保存できるログイベントの最大個数が設定される。デフォルトは512。 |
これらのメソッドで必要事項をセットしたら、必ず activateOptions( ) メソッドで設定したデータを有効にする必要があります。
ここで setBufferSize( ) メソッドについてもう少し詳しく説明しておきます。SMTPAppender はデフォルトでは、レベルが ERROR または FATAL であるイベントが発生したときに、ログが出力されると説明しました。これは、Logger クラスの error( ) メソッドか fatal( ) メソッドが呼び出されたときに、バッファに溜められたログが出力されるということです。そして、error( ) メソッドまたは fatal( ) メソッドが呼び出されると、バッファはクリアされます。
例えば、あるLogger オブジェクトのイベントレベルを DEBUG と設定していて、error( ) メソッドが呼び出される前に、warn( ) メソッドや debug( ) メソッドが呼び出されている場合、バッファには warn( ) メソッドと debug( ) メソッドによるログイベントが保存されます。そして error( ) メソッドが呼び出されると、バッファに記録されているログイベントがメールとして出力されるのです。次のプログラムではどのようなメールが届くでしょうか?次のプログラムでは Logger オブジェクトと Layout オブジェクトは既に適当に作成されています。
(略) SMTPAppender appender = new SMTPAppender(); appender.setFrom(sample_to_address); appender.setTo(sample_from_address); appender.setSubject(subject); appender.setSMTPHost(smtphost); appender.setLayout(layout); appender.activateOptions(); logger.addAppender(appender); logger.setLevel(Level.DEBUG); logger.debug("DEBUG!!"); logger.info("INFO!!"); logger.warn("WARN!!"); logger.error("ERROR!!"); logger.fatal("FATAL!!"); (略)
2 行目で、SMTPAppender オブジェクトを生成し、3 〜 8 行目で基本的な設定を行っています。この時点でバッファサイズは、特に何も指定していませんので、デフォルトの 512 です。10 行目で Logger オブジェクトに SMTPAppender オブジェクトをセットし、11 行目でそのイベントレベルを DEBUG に設定しています。
13 行目〜 17 行目でログイベントが発生しています。error( ) メソッドが呼び出されるまで、バッファにイベントログが溜められます。error( ) メソッドが呼び出された時点で、バッファには debug( ) 、info( ) 、warn( ) メソッドに3つのイベントログが溜められています。error( ) メソッドが呼び出されると、error( ) メソッドによるイベントログがバッファに追加され、バッファ内の全てのイベントログがメールとして出力されます。バッファはクリアされ、fatal( ) メソッドが呼び出されると、バッファには fatal( ) メソッドによるイベントログが追加されます。そして、バッファ内のイベントログがメールとして出力されることになります。すなわち、4 つのイベントログが書かれたメールと、1つのイベントログが書かれたメールが届くことになります。
ここで、 setBufferSize( ) を使用して、バッファサイズを 1 にすると、error( ) メソッドによるイベントログのメールと、fatal( ) メソッドによるイベントログのメールが届きます。
設定ファイルを使用する場合は、次のように記述します。
1: # sampleLogger 2: log4j.logger.sampleLogger=WARN,A5 3: 4: # APPENDER A5 5: log4j.appender.A5=org.apache.log4j.net.SMTPAppender 6: log4j.appender.A5.BufferSize=5 7: log4j.appender.A5.To=mail_address 8: log4j.appender.A5.From=mail_address 9: log4j.appender.A5.Subject=smtp_appender_log 10: log4j.appender.A5.SMTPHost=your_smtp_server_name
(実習課題1)
全てのレベルのログイベントを故意に発生させ、WARN以上ログイベントが発生した場合のみ、ログとして出力されるプログラムを作成しなさい。
- ログの出力先は SMTPAppender を使用すること。
- ログのフォーマットは、3章の実習課題1に示す PatternLayout を使用すること。
- debug 〜 fatal までのイベントを発生させて、届くメールを確認すること。