4.2. org.apache.log4j.net.SyslogAppender クラス
SyslogAppender を使うとリモートのシスログ・デーモンへログ・メッセージを送信する事ができます。SyslogAppender オブジェクトを生成するコンストラクタは次のとおりです。
1: SyslogAppender() 2: SyslogAppender(Layout layout,int syslogFacility) 3: SyslogAppender(Layout layout,String syslogHost,int syslogFacility)
一つ目のコンストラクタは単にオブジェクトを生成するだけですが、二つ目のコンストラクタでは出力フォーマットを決める Layout オブジェクトと、 facility を指定することができます。 facility とはシステムログの種類のことで次表の SyslogAppender クラスのクラス変数を使用します。次表の facility の kern 、 user などが syslog.conf に使用する facility です。デフォルトは user です。
クラス変数 | facility |
---|---|
LOG_KERN | kern(カーネル関連) |
LOG_USER | user(ユーザアプリケーション) |
LOG_MAIL | mail(メール関連) |
LOG_DAEMON | daemon(デーモン関連) |
LOG_AUTH | auth(セキュリティ・認証関連) |
LOG_SYSLOG | syslog(syslog自身のメッセージ) |
LOG_LPR | lpr(プリンタ関連) |
LOG_NEWS | news(NetNews関連) |
LOG_UUCP | uucp(UUCP関連) |
LOG_CRON | cron(cron関連) |
LOG_AUTHORIV | authpriv(プライベートのセキュリティ・認証関連) |
LOG_FTP | ftp(ftp関連:FreeBSDのみ) |
LOG_LOCAL0〜7 | local0〜local7(独自利用向け) |
三つ目のコンストラクタでは、出力フォーマットと faclity に加えて syslogd の稼動しているホスト名を指定することができます。また出力フォーマットは setLayout( String Layout )で、ホスト名は setSyslogHost( String syslogHost ) で指定することが出来ます。 facility は setFacility( String facility ) で設定できますが、引き数は前表の facility に示す文字列を指定します。 facility を syslog にする場合は setFacility( "syslog" )、local4 にする場合は setFacility( "local4" )とします。
SyslogAppender を使用して、リモートの syslogd の稼動するホストへログを出力するとき、リモートホストの syslogd はネットワークからのメッセージを受信できる状態でなければなりません。 syslogd を "-r" オプションをつけて起動することにより、ネットワークからのメッセージを受信できるようになります。
次の例は warn 以上のログ出力イベントが発生したときに、sampleHost で稼動している syslogd にログを出力するようにしたものです。
(略) SyslogAppender appender = new SyslogAppender(); appender.setSyslogHost("sampleHost"); appender.setLayout(layout); appender.setFacility("local"); appender.activateOptions(); logger.addAppender(appender); logger.setLevel(Level.WARN); logger.debug("debug!!"); logger.info("info!!"); logger.warn("warn!!"); logger.error("error!!"); logger.fatal("fatal!!"); (略)
2行目で SyslogAppender オブジェクトを生成し、3〜5行目で必要事項を設定しています。6行目で設定した値を有効にしています。このプログラムをコンパイルして実行すると、リモートホストの syslog.conf の設定に従って、ログが記録されます。
ここで、syslog.conf の記述方法について説明しておきます。syslog.conf は稼動している syslogd がメッセージを受け取ったときに、どのようにログを記述するのか、そのルールを規定するものです。syslog.conf は selecter フィールドと action フィールドから構成されています。
1: # syslog.confの構成 2: 3: [selecter field][tab| ][action field] 4: ...
selecter フィールドと action フィールドは TAB 文字か1つ以上の空白文字で区切ります。そして、selecter フィールドで facility と priority を指定します。facility は前にも述べたようにシステムログの種類を表します。前に紹介した表に示される facility を記述します。priority は logger クラスに優先度を設定するときに説明した Level クラスのイベントレベルとほぼ同じものです。syslog.conf で設定できる priority は、debug 、info 、notice 、warning 、warn ( warning と同じ)、err 、error ( err と同じ)、crit 、alert 、emerg 、panic ( emerg と同じ ) です。これらと Level クラスのイベントレベルとの対応は次表のようになっています。facility と priority は「.」で区切ります。
Levelクラスのイベントレベル | syslog.confの優先度 |
---|---|
DEBUG | debug |
INFO | info |
WARN | warning、warn |
ERROR | err、error |
FATAL | crit、panic、emerg |
この表より syslog.conf で priority に notice と alert を指定しても何も出力されないということがわかります。
action フィールドは syslogd が受け取ったメッセージをどこに出力するのかを指定するフィールドです。出力先はフルパスで指定しなければなりません。また指定した出力先のファイルはあらかじめ作成されていなければなりません。syslog.conf のフォーマットを整理しておきます。
1: (略) 2: [selecter field][tab| ][action field] 3: 4: [facility].[priority][tab| ][log_file_path] 5: 6: # 例 7: user.warn /var/log/sample_warn.log 8: syslog.err /var/log/sample_err.log 9: (略)
selecter フィールドで priority が共通で facility が複数ある場合は次のように書くことができます。
1: # priority が共通、「,」を使用 2: user,syslog.err /var/log/sample.log
action フィールドを共有するには次のように書くことができます。
1: # action フィールドが共通、「;」を使用 2: user.warn;syslog.err /var/log/sample.log
また「*」を使用して全ての facility や priority に対応することもできます。
1: # 全ての facility や priority に対応、「*」を使用 2: *.emerg /var/log/all_emerg.log 3: kern.* /var/log/all_kern.log
ある facility に対して、「 none 」を使用することで、全ての priority のメッセージを拒否することもできます。
1: # 全ての priority からのメッセージを拒否、「none」 2: mail.none /var/log/mail.log # ログファイルの指定は無効
また、出力先につまり action フィールドに「@ホスト名」とすることで、syslogd が受信したメッセージを指定したホストの syslogd に渡すことができます。このとき指定したホストの syslogd は "-r" オプションで起動されてなければなりません。
1: # 別のホストで稼動するsyslogdにメッセージを渡す 2: local4.warn @sample.remote.host
「#」を使用すると、同じ行のこれ以降の文字列は無視されます。
Log4J の説明に戻ります。設定ファイルを使用する場合は、次のように記述します。
1: # sampleLogger 2: log4j.logger.sampleLogger=WARN,A6 3: 4: # APPENDER A6 5: log4j.appender.A6=org.apache.log4j.net.SyslogAppender 6: log4j.appender.A6.SyslogHost=your_syslog_host_name 7: log4j.appender.A6.Facility=local0 8: log4j.appender.A6.Layout=org.apache.log4j.PatternLayout 9: log4j.appender.A6.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
(実習課題2)
全てのレベルのログイベントを故意に発生させ、WARN以上ログイベントが発生した場合のみ、ログとして出力されるプログラムを作成しなさい。
- WARN 以上のログイベントが発生したときは、リモートの syslogd にメッセージを渡すこと。
- ERROR 以上のログイベントが発生したときは、メールにログを出力するようにすること。
- syslog.conf の記述を変えてどのようにログが出力されるか確認すること。
- SyslogAppender で使用する Layout は3章の実習課題1に示す PatternLayout を使用すること。