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 ポートを介してログを送信している。はず。
プロトコル上、取りこぼしはどうしやうもない。

2009-01-21

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

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

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


※ 構成、sample.jar(Test.java)、run.sh 以外は 前回 と同じ


構成
/home
└ /work
├ /jar
│  ├ sample.jar
│  └ log4j-1.2.15.jar
├ /logs
└ run.sh
 



ファイル作成

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.WARM);
        logger.debug("debug.");
        logger.info("info.");
        logger.warn("warn.");
        logger.error("error.");
        logger.fatal("fatal.");
    }
}
 


run.sh
#!/bin/sh

SAMPLE_HOME=${PWD}

export LIBS=${SAMPLE_HOME}/jar/log4j-1.2.15.jar:${SAMPLE_HOME}/jar/sample.jar

JAVA_CMD=$JAVA_HOME/bin/java

CMD=${JAVA_CMD}" -classpath "${LIBS}" foo.boo.Test"

${CMD}
 






なんら前回と大差ない。
log4j.properties を削除して、ソース内に設定内容を保持しただけ。

2009-01-20

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


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

条件
  • 外部ファイル(log4j.properties)から設定内容を取得する
  • カテゴリ名は syslog とする
  • Facility は local0 とする
  • Facility が local0 のログは /home/work/logs/sample.log に出力する
  • ログレベルが WARN 以上のメッセージを出力する


構成
/home
└ /work
├ /jar
│  ├ sample.jar
│  └ log4j-1.2.15.jar
├ /logs
├ log4j.properties
└ run.sh
 



環境
  • jdk1.6.0_04
  • log4j-1.2.15
  • CentOS5


ファイル作成

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

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class Test {

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

    public static void main(String[] args) {
        PropertyConfigurator.configure(args[0]);
        logger.debug("debug.");
        logger.info("info.");
        logger.warn("warn.");
        logger.error("error.");
        logger.fatal("fatal.");
    }
}
 


log4j.properties
#rootLogger
log4j.rootLogger=DEBUG

# syslog
log4j.logger.syslog=WARN,syslog

#  APPENDER syslog
log4j.appender.syslog=org.apache.log4j.net.SyslogAppender
log4j.appender.syslog.SyslogHost=127.0.0.1
log4j.appender.syslog.Facility=local0

log4j.appender.syslog.layout=org.apache.log4j.PatternLayout
log4j.appender.syslog.layout.ConversionPattern=%6p %c{1} - %m%n
 

参考:(Apache Log4j 1.2.15 API)


run.sh
#!/bin/sh

SAMPLE_HOME=${PWD}

export LIBS=${SAMPLE_HOME}/jar/log4j-1.2.15.jar:${SAMPLE_HOME}/jar/sample.jar

JAVA_CMD=$JAVA_HOME/bin/java

CMD=${JAVA_CMD}" -classpath "${LIBS}" foo.boo.Test "${SAMPLE_HOME}"/log4j.properties"

${CMD}
 



CentOS の設定

/etc/syslog.conf に追加。
/etc/sysconfig/syslog を変更。
syslogd の再起動。
ついでに、514/udp ポートの確認。
# vi /etc/syslog.conf
----- ----- -----
# 追加
local0.* /home/work/logs/sample.log

# vi /etc/sysconfig/syslog
----- ----- -----
# 変更前
# SYSLOGD_OPTIONS="-m 0"
# 変更後
SYSLOGD_OPTIONS="-m 0 -r"

# service syslog restart

# netstat -an | grep -i udp | grep 514
 

参考


実行。
# /home/work/run.sh
 


で、/home/work/logs/sample.log にログが出力された。

2009-01-17

『 vol.9 ライフハック祭り 2009 』

 
vol.9 ライフハック祭り 2009 へ参加してきました。


内容
大橋 悦夫さんのお話し。
堀 E. 正岳さんのお話し。
LT 6 名くらい。


感想
参加するも相変わらず講師の方とはお話ししなかった。
堀さんの自己紹介を聞いてバタフライ計画( 順列都市 )が巡ってた。
そもそも、ライフハックってなんだろなぁとか途中から思っていたり。
参加者の職種が限定されてなくって、雰囲気がそこはかとなく違和感があったり。

懇親会も参加。
適度に名刺交換を行うも、ここのブログは名刺に URL のっけてないとか思いながら、まいっかとか。
名刺の管理の仕方をちと聞いてみた。んで、どこでいつ知り合ったのかで、時系列に分類してみやうと思った。
あと、数ヶ月ちと思っていたことを聞くも即否定されてしまった。( これ に参加されて変な飲み物持って帰った人だと思っていた)。
そんで、関西ライフハック研究会で今回初めて女性の方と喋った!!

何はともあれ愉しかったのです。
ただ、自由人にライフハックは難しいとか思いました。



次週(1/24)は
らしいです。
でも、XP 祭り関西 2009 はもう申し込み締め切られてる。