2003年12月06日

syslog-ngへの切り替え(2)

先日の続き

さて、インストールまで完了したので、今度はswatchで動いていた処理を移植します。
swatchでは、swatch同時起動して複数ログを処理させて居ましたが、syslog-ngではネイティブで簡単に対応できるはずなんで、期待大

で、早速移植してみました。

基本的には.swatchrcでの

watchfor /正規表現/
の項目を
filter フィルタ名 {filter(対象ログを書き出すフィルタ名) and match("正規表現");
に置き換えてやるだけですが、うまくいかないのもありました。

それが↓

swatchでの処理
watchfor   /pppd\[[\d]+\]: local  IP address /
        exec "echo $0 | /home/hoge/sh/foo.sh"
移植後
source s_sys { pipe ("/proc/kmsg" log_prefix("kernel: ")); unix-stream ("/dev/log"); internal(); };
destination d_foo{ program("/home/hoge/sh/foo.sh"); };
filter f_mesg     { level(info..emerg) and
                     not (facility(mail)
                        or facility(authpriv) or facility(cron)); };
filter f_foo     { filter(f_mesg)
                      and (match("pppd\[[\d]+\]: local  IP address ")); };
log { source(s_sys); filter(f_foo); destination(d_foo); };
このマッチ条件だけどうしても動かないんで、おかしいなぁとsyslog-ngのソースを追ってみたところregex.hを組み込んで正規表現を使っているようだったので、さらに調べてみると次のようなページを発見。
  • [0-9]や[a-z]のような指定方法も可能ですが、通常はそのような場合は次の文字クラスを用いて指定します。

    文字クラス
    アルファベットや数字といった文字すべてを表す文字クラスには、alphaやdigitなどがあります。isalpha()やisdigit()といったANSIで規定されているis〓()関数の〓の部分はすべてあります。その他、blankがあります。

なるほどねぇ

要するに\dが無いからうまく動かなかったようなので、早速下のようにフィルタを変更してみる

filter f_foo     { filter(f_mesg)
                      and (match("pppd\[[0-9]+\]: local  IP address ")); };
すると無事動作しました( ̄▽ ̄)ノ

でも、切り替えはsyslogの方もswatchの方も予想より楽でした<一番苦労したのはsyslog-ngのドキュメントのなさでしたし(笑)
(特にmatchに関しては本当にドキュメントが無くって(^^;)

さて、これで今後は取りこぼしが起きない事を祈るばかりです(・ω・)ノ

それからその他の設定方法については下記のサイトに載ってますので参照してください。

Posted by Takuchan at 2003年12月06日 01:43 | トラックバック(0)