Zabbix: logrt を少し効率よくできるかもしれない話

こんにちは。サイオステクノロジー OSS サポート担当 山本 です。

突然ですが、皆さん Zabbix は使っているでしょうか?
Zabbix で特に目立って便利な機能の一つといえば、そう、ログ監視ですね。
以下のように簡単な設定でログ監視を実現することができます!

logrt["/var/log/messages.*"]

はい、これはあまりよくないですね。一応、動きはしますけれど…

今回は便利だけど意外と複雑な、 Zabbix のログ監視アイテム logrt の設定について、少しお話ししたいと思います。

■特定の文字列を含むログだけを取得するようにしよう

先ほどの設定は対象のログファイル /var/log/messages のログ全てを監視データとして取得する設定です。
このような設定の何が一番ダメかと言えば、「ログ全てを監視データとして取得」してしまうことでしょう。

監視として無関係で不必要なログも含めログを取得するようにしてしまうと監視データから有効な情報を探すという二度手間が発生しますし、ログファイルを丸ごと監視データとして取得するなら普通はログファイルのバックアップを保存しておけば事足りるはずです。
また、Zabbix でログの監視データを保存するには「いつ保存したか」「どのアイテムのデータか」…などのような監視情報が付加されてデータベースに保存されるため、ただログファイルのバックアップを保存するよりも圧倒的に多くディスク容量を要求します。何も制限せずに全てのログを取得するような設定では、結果としてディスク容量の枯渇などに繋がりかねません → Zabbix で disk full
そのため、監視対象のログファイルが「何か問題があった時以外には何も出力されないログファイルで、全てのログに対して監視・アラートを行いたい!」という特殊なログファイルでもない限り、先ほどのようなログファイル名だけを指定する方法はおすすめできません。

logrt アイテムでは第2オプションを設定すると、第2オプションで指定した正規表現に合致するログのみを取得対象とすることができます。
例えば、「ERROR」か「WARN」を含むログだけを取得するなら以下のような形になります。

logrt["/var/log/messages.*","ERROR|WARN"]

監視対処を絞ることで監視データから有効な情報を得やすくしたり、将来的な負荷・容量問題の対策にも繋がることが期待できます。
logrt アイテムを使うならば、予め収集したいログの内容を調査してこの第2オプションを設定するようにしましょう。

■logrt アイテム登録時点よりも前の情報はいらない?

時には、運用を始めてからしばらく経った環境に新しく logrt アイテムを追加するようなこともあると思います。
先ほどのような設定の場合、logrt アイテムは条件に合致するログファイルの先頭から解析処理を始めるため、過去のログを監視・検知します。

過去のログの検知が必要ない場合、logrt アイテムの登録時第5オプションに “skip” と設定すると logrt アイテムを登録した後のログのみを解析・検知することができるようになります。
例えば、先ほどの設定に追加すると以下のような形になります。

logrt["/var/log/messages.*","ERROR|WARN",,,skip]

これによって無駄な解析処理や検知を省くことができます。
注意点として、この第5オプション “skip” は新規登録する logrt アイテムにのみ有効で、アイテムの設定変更で追加しても効果はありません。

■検知が大きく遅れることがある?

実は logrt アイテムで一度に解析できるログの行数は、設定により制限されています。
そのため滅多にないこととは思いますが、監視対象のログファイルに大量のログが書き出される環境や、先述の “skip” 設定をせずに膨大な行数のあるログファイルを監視対象とした場合、logrt アイテムでの検知が遅れる場合があります。

logrt で一度に解析できるログの行数は logrt の第4オプションで指定した数値によって決まります。
 ・アイテムとして取得する対象のログが [第4オプションで指定した値]×[監視間隔 (秒)] 行見つかる
 ・[第4オプションで指定した値]×[監視間隔 (秒)] の 10倍の行数を解析する (Zabbix 3.0 以前では 4倍)
 ・最新の行まで解析を終える
のいずれかの条件を満たすまで、一度の解析で logrt アイテムは解析を行います。
例えば、1秒当たり最大 300行を解析させたい場合、以下のように設定します。

logrt["/var/log/messages.*","ERROR|WARN",,30,skip]

第4オプションを指定しなかった場合は監視対象側の Zabbix agent の設定ファイル zabbix_agentd.conf の “MaxLinesPerSecond (デフォルト:20)” が適用されます。

余談ですが、このセクションに書いたとおり logrt アイテムは監視間隔の長さに応じて一度に解析する行数が増えます
そのため、logrt アイテムについては、監視間隔を長くすると瞬間的に負荷が高くなる可能性や、逆に監視間隔を短くしたほうが総合的には負荷が小さくなる可能性があります。

また、最初のセクションでお話しした「特定の文字列を含むログだけを取得する」ようにしていないと、logrt はデフォルトでは1秒当たりに20行までしか解析できないことになります。そのため、改めてですが、第2オプションを使って必要なログだけを取得するように設定することは忘れないようにしましょう。

■古いログファイルのデータを再検知してしまう?

稀にですが、過去のログファイルを logrt が解析してしまうことがあります。
この問題は copytruncate 方式でのログローテーションを行う場合に発生しやすいもので、ローテートで作成された新しい過去のログファイルに対して発生します。
copytruncate でのログローテーションの再検知問題は、logrt の第8オプションに “copytruncate” と設定することでほとんど発生しなくなります。

logrt["/var/log/messages.*","ERROR|WARN",,30,skip,,,copytruncate]

余談ですが、logrt では対象のログファイルの更新日時やファイルサイズ、inode やファイルの内容の一部の MD5 チェックサムを利用して、できる限り重複した検知をしないようにしています。
逆に言えば、これらに影響を与えるような操作を頻繁にしている場合、先述のログローテーション以外でも過去のログの再検知が行われてしまう可能性があります。例えば、以下のような場合などが挙げられます。

 ・ログファイルの更新日時だけが更新される (touch コマンドなど)
 ・ログファイルのファイルサイズが縮小する
 ・ログファイルのバックアップを作成し、後にそのバックアップファイルをコピー元の名前に変更して上書きする

■最後に

今回は Zabbix の logrt の結構重要なオプションについてお話ししました。

ログ監視を簡単に設定できる logrt ですが、よくよく見ると環境によってはしっかりと設定しなくては非効率になる可能性があります。
logrt の動作に違和感を感じた場合、特に細かくは設定していなかったな…という場合、Zabbix のディスク使用量が気になっている場合などは、一度この設定を見直してみてはいかがでしょう。

なお、今回紹介した logrt オプションは一部のオプションのみです。より詳細に知りたい方は、以下のドキュメントなども参照してください。

1 Zabbix agent

6 Log file monitoring

ZabbixはZabbix LLCの登録商標です。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

2人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です