【logrt[]】ログローテーション後に過去ログを読み込んでしまう事象の対処
以下の環境および条件下にて、対象ファイルのローテーション後に、
前日分のログを先頭から全て読み込んでしまい、重複して通知が発生しております。
■環境 : zabbix server 2.4.6 / zabbix agent 2.4.6
■アイテム : logrt[/var/log/messages,@Linuxfilter]
■間隔 : 60秒
■トリガー : {hostname:logrt[/var/log/messages,@Linuxfilter].iregexp(.*,65)}=1
■対象ファイル(/var/log配下):
messages
messages.yyyymmdd
・・・
過去7日間分保持しています
■ローテーション方法:
messagesを前日日付でコピーし、messagesをクリア(dev/null)
※独自のシェルにて、日替わりの0時5分に起動しています
バグや他の方の投稿などを確認しているのですが、
同様の事象であるかの判断がつかないため、投稿させて頂きました。
本事象の原因および対策についてご教示頂ければと思います。
TNK - 投稿数: 4717
下記のURLで書かれているlogrotateのcopytruncateと同じ状態に
なってしまっていると思います。
1つの案として、以下のURLでも書かせて頂いていますが、logrt[]
ではなくlog[]を利用するようにして、さらにアイテムの更新間隔
を短めに設定して、なるべく取りこぼしが無いよう対応されてはい
かがでしょうか?
ご参考:
http://www.zabbix.jp/node/3669
http://www.zabbix.jp/node/3995
fjnaga - 投稿数: 2
TNK様
ご回答ありがとうございます。
logrt[]はローテーションするログに対する監視に利用するものだと思いますが、
copytruncateと同様のローテーションでは事象が発生してしまう場合、
logrt[]が正常に動作するローテーションはどのようなものにするべきなのでしょうか。
この事象自体がバグ等によって引き起こされている場合は、Fixされたagentのバージョンはありますでしょうか。
TNK - 投稿数: 4717
logrotateのデフォルトでは、
1. ログファイル名を変更する
2. デーモンにシグナルを送って新しいログファイルに出力させる
というような処理が行われていたと思います。
/var/log/messagesということであれば、rsyslogdやsyslogdを使用
されていと思いますので、ファイル名を変更後にそのデーモンにHUP
シグナルを送れば良いと思います。
例えば、CentOS 7.4のrsyslogdの場合、logrotateの設定は以下の
ファイルに記載されています。
/etc/logrotate.d/syslog
バグではないと思います。
ローテーションの方式を見直すか、先ほど書いたような対策をご検
討ください。
wakaba - 投稿数: 228
広瀬です
少々補足です
copytruncateは処理の関係上、対象ファイルの最終inode情報が更新されません。
対して、logrt[]アイテムキーはファイル変化状態を追い続ける場合にinode情報を見ています。
copytruncateはローテーションされたファイル(つまり1世代前のファイル)の最終inode情報が
Zabbix側で記憶されている最終inode情報が同じですから、再度舐めてしまいます。
copytruncateの処理はつまりは、以下の処理と同じです
cat hogehoge.log > takotako.log && echo -n > hogehoge.log
ローテーションされた瞬間にOSバッファーに残っている情報が1世代前のファイルに
書き込まれてしまう場合は多々あります(上記の場合だと、&&以降の処理に移る瞬間など)
バグではなく仕様です。LinuxでもWindowsでもOS問わずその辺のハンドリングは同じ
事が言えます。ログ出力方式を変えるか、ログ監視方式を変える以外に現時点で有効な
打開策は無いと思います。これはZABBIX以外の監視でも同じ事が言えます