syslogとswatchからsyslog-ng乗り換えについて雑多メモ
この前書いた「syslogは実は重い→syslog-ngやdaemontoolsのmultilogにしてみるとか」が結構人気らしい。 実はあの記事には少々おかしいというか不足というか誤解を招く部分もあるので、それを補うべく、 っていうかつまり調子に乗ってsyslog-ngへの移行について、雑多なメモを書いてみる。
なお、誠に申し訳ないが、巷のハウツーものの記事のように細かいことはここでは書いてない。期待してた方には申し訳ないが、ダウンロードはどこからだとかコンパイルの仕方とか設定ファイルの例とかをご期待の方は適宜ググって他をあたっていただきたく。
読み進める前に
次のような場合にはsyslogのままでいいと思う。- 大した量のログを吐くわけでもないマシン
- ログの種類や監視レベルに細かな制御を必要としないマシン
- つまりそもそも大して重要でないマシン
- かなりの量のログが吐かれるので、ディスクI/Oを細かく制御できるsyslog-ngにすることで少しでも性能をあげたい場合
- ログ監視のためにswatchを別にインストールしたり設定したりするのが面倒な場合。ログのローテートのときにswatchの再起動になぜだか失敗して??な場合。
- 複数のログファイルを監視するためにswatchを何本も立ち上げることに疑問を感じている場合(ただでさえperlの常駐プロセスなんて重そうなのに・・・)
- 別のマシンのログをリモートで集めてるマシン(syslogdは通信にUDPを使うゆえにログを取りこぼす可能性があるという致命的弱点がある)
syslogdとsyslog-ngの性能比較について
筆者はまともな性能比較やってない(おい)。ログを記録する、という性格上、ディスクI/Oまわりの性能がキーポイントになるわけだが、syslog-ngで sync(20) とか設定するのと、 syslogdで -/var/log/hogelog のようにハイフンをつけてfsyncを抑制するのとでどっちが性能が良いのかは正確なところよく知らない。 ただ、syslog-ngのほうが、sync()で設定する数値を変えることでディスク書き込み頻度を細かく制御できるという点で、syslogよりも柔軟性が高いといえるのではないだろうか。 なおsync()て何という話は後述。
改めて、syslog-ngだとなにがいいのか?
- ログ出力だけでなく、監視機能がある。つまりswatchのような機能が同梱されている。
- ディスク書き込みの頻度を細かく制御できる。sync()オプション。詳しくは後述。
- リモートでログとっても取りこぼしが少ない(らしい)。UDPじゃなくTCPだから。(ただし本記事ではリモートログの話はありません。筆者はリモートログ使わない環境で試してるもんで。)
- ログファイル名にYYYYMMみたいな日付マクロが使える=ということはログローテーションは勝手に行われる!=logrotateコマンドをcronで起動して云々という必要がない。
sync()オプションについて
sync()オプションは、どのくらいのログをバッファとして溜め込んでおくか?である。 巷の設定例では sync(0) にしている例が見られるが、これだとバッファせずに1行ずつ常にディスクに書き込みにいくので、当然ディスクI/O性能が悪化する。例えばsync(100)にすると、ログが100行たまったらはじめてそれをディスクに書き込みに行くので、I/O頻度が減る=性能向上。 ただし、tailコマンドなどでログファイルを見ているとき、「いつまでたってもログに出ないんですけど」「ある程度バッファしてるんだからそりゃそうだろ」という罠にご注意。swatchも結局はtailコマンドないしはperlのFile::Tailでログファイルの末尾を直接監視しているのだから同じ罠が待っている。
監視機能について
filter設定でたとえばfacility(hogehoge...) and priority(hogehoge...) and match("正規表現")のようにする。 destinationで出力先を "file(ファイル名)" ではなく "program(プログラム名)" にすればよい。 ちなみに、マッチしたログをメールで送りたい場合には、単純に/bin/mailコマンドにでもパイプで送り込めばいいのかなと思ったらうまくいかなかった。シェルを書く必要があるらしい。ちなみにこんな感じ。
#!/bin/sh while read line do echo $line | /bin/mail -s "Message on syslog-ng" hogehoge@example.com; done
ログローテーションについて
たいてはlogrotateコマンドコマンドが週イチとかで動いていると思うが、当然そのときはログデーモンを再起動させる必要がある。通常はsyslogdにSIGHUPコマンドが送り込まれるようになっているが、それをsyslog-ngの再起動に置き換えるだけ。syslog-ngに勝手にログローテーションさせることで、logrotateの定期起動自体を不要にすることもできる。 destination設定で
file("/var/log/$YEAR$MONTH_messages")とかすれば月イチでログローテーションするのと同じことになる(古いログの圧縮はされないけど)。 設定で使えるマクロについてはこちら。
ただし、ログファイルについてはlogwatchコマンドなどが定期起動して監視している場合があるため、 ログファイル名を変えてしまうとそっちのほうも変更する必要が出てきてしまうので注意。
(このエントリは未完。修正、追記される場合がありあり)

コメントする
(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)