5. APPENDER3
5.1. org.apache.log4j.net.SocketAppender クラス
このクラスはリモートの Log4J サーバに対してログを出力するときに使用します。コンストラクタは次のようになっています。
1: SocketAppender() 2: SocketAppender(InetAddress address,int port) 3: SocketAppender(String host, int port)
一つ目のコンストラクタは単に SocketAppender オブジェクトを生成するだけです。二つ目のオブジェクトは引き数に java.net.InetAddress オブジェクトとポート番号を指定します。 InetAddress オブジェクトはこのクラスのクラスメソッド、 getAllByName ( String host ) 、getByName ( String host ) 、getLocalHost( ) を使用して生成することができます。三つ目のコンストラクタでは、リモートホスト名とポート番号を指定します。
これまでと同じようにオブジェクト生成後に、setRemoteHost( String host ) と setPort( int port ) メソッドで設定することができます。
その他に一度接続に失敗したときに、再度接続を試みるまでの時間間隔を設定することが出来ます。これは setReconnectionDelay( int delay ) メソッドで設定することができます。ミリ秒で指定します。デフォルトは 30000 つまり 30 秒です。この値を 0 としたとき、再接続は行いません。
これらの設定を有効にするために、activateOptions( ) メソッドを実行することを忘れないで下さい。
また、SocketAppender オブジェクトでは Layout を設定する必要はありません。出力フォーマットはリモートの Log4J サーバが決定することだからです。
当然の話ですが、 SocketAppender クラスを使用してログを出力させるには、リモートサーバに Log4J サーバが稼動している必要があります。 Log4Jには org.apache.log4j.net.SocketServer クラスと org.apache.log4j.net.SimpleSocketServer クラスが用意されていて、これを使用することで簡単に Log4J サーバを稼動させることが出来ます。 SocketServer を使用して Log4J サーバを稼動させるには、次のコマンドを入力します。
SocketServer を使用する場合 $ java org.apache.log4j.net.SocketServer port configFile configDir
SocketServer クラスと SimpleSocketServer クラスは main( ) を実装しているので、そのまま実行することが出来ます。 SocketServer を利用する場合、このサーバが受け付けるポート番号( port )、設定ファイル名( configFile )、設定ディレクトリ名( configDir )を指定します。
SocketServer がログを出力する際に、Appender と Layout を設定しなければなりませんが、これには設定ファイルを使用します。SocketServer は PropertyConfigurator を使用していますので、設定ファイルの書き方はこれまでの設定ファイルと同じです。
それでは SocketServer はどのようにして設定ファイルを使用するのでしょうか? SocketServer はあるホストからログ出力を受け取ると、まずそのホスト用の設定ファイルを探します。この SocketServer を起動するときの引き数で指定したディレクトリ( configDir )以下を探します。ここにそのホスト名+「.lcf」というファイルがあるとそのファイルの設定に従ってログを出力します。例えば、ホスト名が「 example.host 」で、設定ディレクトリ( configDir )が「 /example/conf 」だとすると、 SocketServer は一番最初に、「 /example/conf/example.host.lcf 」というファイルが無いか探すということです。このファイルが存在しない場合は、設定ディレクトリ( configDir )以下の「 generic.lcf 」という名前の設定ファイルを探します。先の例に従うと「 /example/conf/generic.lcf 」というファイルを探します。このファイルが存在した場合は「 generic.lcf 」の内容に従ってログが出力されます。このファイルも存在しない場合に、SocketServer を起動した時の引き数で指定した設定ファイル( configFile )に従ってログが出力されます。
このようにして、クライアントであるホスト毎にログの出力方法が指定することができます。
SimpleSocketServer を使用して Log4J サーバを起動するには、次のコマンドを入力します。
SimpleSocketServerを使用する場合 $ java org.apache.log4j.net.SimpleSocketServer port configFile
SimpleSocketServer を利用する場合は、ポート番号( port )、設定ファイル( configFile )を指定します。SimpleSocketServer は起動時に指定した設定ファイル( configFile )のみに従って、ログを出力します。
最後に、設定ファイルで SocketAppender を使用する場合の例を示します。
1: # sampleLogger 2: log4j.logger.sampleLogger=WARN,A7 3: 4: # APPENDER A7 5: log4j.appender.A7=org.apache.log4j.net.SocketAppender 6: log4j.appender.A7.Port=5000 7: log4j.appender.A7.RemoteHost=example.host 8: log4j.appender.A7.ReconnectionDelay=10000
(実習課題1)
全てのレベルのログイベントを故意に発生させ、WARN以上ログイベントが発生した場合のみ、ログとして出力されるプログラムを作成しなさい。
- SocketAppender を使用しすること。
- 適当なコンピュータに Log4J サーバを立てること。
- SocketServer を使用すること。
- 設定ファイルと設定ディレクトリを変えてみて、どのような挙動を示すか試すこと。
- SocketServer の出力 Layout は3章の実習課題1に示す PatternLayout を使用すること。