2009-01-22

Java : log4j を使ってログを syslog に出力してみる(in CentOS5) - 3


log4j を使ってログを大量に syslog に出力してみる。in CentOS5

条件
  • 外部ファイルを使用しない
  • カテゴリ名は syslog とする
  • Facility は local0 とする
  • Facility が local0 のログは /home/work/logs/sample.log に出力する
  • ログレベルが INFO のメッセージを 100,000 件出力する


※ sample.jar(Test.java) 以外は 前回 と同じ


sample.jar(Test.java)
package foo.boo;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.net.SyslogAppender;

public class Test {

    static Logger logger= Logger.getLogger("syslog");

    public static void main(String[] args) {
        PatternLayout layout = new PatternLayout();
        layout.setConversionPattern("%6p %c{1} - %m%n\n");
        SyslogAppender appender = new SyslogAppender();
        appender.setSyslogHost("127.0.0.1");
        appender.setLayout(layout);
        appender.setFacility("locel0");
        appender.activateOptions();
        logger.addAppender(appender);
        logger.setLevel(Level.ALL);

        for (int i=1; i<100000; i++) {
            logger.info("test message " + i);
        }
    }
}
 


結果
10 万件中、大体 1 万件が出力された。


考察

... なぜ、取りこぼし?
先ずは、ソースを追っかけてみた。

  • syslog に出力するので org.apache.log4j.net.SyslogAppender を使っている
  • org.apache.log4j.net.SyslogAppender は org.apache.log4j.helpers.SyslogQuietWriter#write(-) を使って出力している
  • org.apache.log4j.helpers.SyslogQuietWriter#write(-) は java.net.DatagramSocket / DatagramPacket を使って通信している


ただ、 前々回 になんてやっているにもかかわらず。


ついでに、514/udp ポートの確認。
# netstat -an | grep -i udp | grep 514



そろそろ気がつこう。


ログ転送によるメリット/デメリット

デメリットに挙げた「UDPによる転送のため取りこぼしの可能性が生じる」は、UDPはTCPと違い相手に届いたかどうかの確認を行わず、また再送もしないため(*その代償として、「TCPよりも高速なデータの配送」が得られる。)、ログの損失の可能性が生じる。その確率は、ログが大量かつ頻繁に発生するにつれ高くなる。




log4j の org.apache.log4j.net.SyslogAppender はリモートの syslogd へ 514/udp ポートを介してログを送信している。はず。
プロトコル上、取りこぼしはどうしやうもない。

0 件のコメント:

コメントを投稿