きっちりログを分けたいの
ネタで悩んでいるお隣さんまでのつなぎです。anaitoです。
MiracleLinuxをはじめとするLinuxでは、ログのローテーションはlogrotateを使うのが普通です。
ウチのデフォルトであれば、/etc/cron.dailyにlogrotateのキックが突っ込まれているので4時02分にローテーションされます。logrotateの設定を変更してweeklyからdailyに変更すると確かに毎日ファイルがローテーションされているのが確認出来ます。
ですが、、、ローテーションしているタイミングは朝方です。つまりある一日のログを確認するには2ファイル確認する必要があります。(たとえweeklyでもローテーションするときにはファイルを跨ぐ日がでてしまいますね)
なんかイヤですね~。しかし、
「2ファイル確認すればええやん。」とあなたは妥協したとしましょう。
するとlog4jなら簡単なのにフフン♪と通行人に言われることうけあいですorz
そんな風に追い込まれれば早く妥協を撤回してなんとかしなければいけませんよね?
そんなわけで、考えていきましょう。
まず考えつくのが/etc/cron.daily(要するに/etc/crontabの設定)でキックするのをやめてrootユーザのcrontabに0時ぴったりにキックするようにすることですね。私の経験上、これで98%ぐらい達成出来ます。あとの2%は前処理やらなんやらで取りこぼしがあるかもしれません。
じゃあ、取りこぼしを加味して2ファイル確認すれば、、、ってなんの解決にもなっていませんネ!?
こんな時は標準のsyslogdではなくて、syslog-ngを使ってみましょう。MiracleLinux 4.0には入っていますし、syslog-ng本家のソースにはspecファイルが含まれるのでrpmにするのも簡単です。MLの場合は、chkconfigでどちらか一方が起動するようにして下さい。
細かくは割愛しますが、syslog-ng.confのなかではMACRO機能が使えます。今回のような場合であればdestination設定に$DAYを使えば日が変わると勝手に日付を変更して出力するようになります。これは外部プログラムによるものではないのでlog4jのDailyRollingFileAppenderと同じような動きになります。
MACROについてはこちらのTable 3.6.を参照してみて下さい。
このMACROを使って極端に合理的な設定をするとdestination, filter, logの設定は3行で済んじゃいます。
destination d_net { file("/var/log/$FACILITY/$YEAR-$MONTH-$DAY.log"); };
filter f_all { level(info..emerg); };
log { source(s_remote); filter(f_all); destination(d_net); };
気をつけないといけないのは無いディレクトリはつくってほしいのでoptionsのcreate_dirs(yes);ですか。
どうです?スッキリしてますよね。
ちなみにremove_if_olderなんて設定もあるのでファイルを削除することも出来ます。最近では設定例などもよく見かけるようになったので試してみては如何でしょうか?








最近のコメント