採用情報 お問い合わせ

BLOG

Zabbix Agent / Zabbix Agent 2 でのテキストログ監視でよくある質問

はじめに

サイバートラストでは Zabbix や MIRACLE ZBX に関する技術サポートを提供しています。日々、様々なお問い合わせをいただいていますが、その中でも「テキストログ監視」に関する問い合わせを多くいただきます。
今回は Zabbix / MIRACLE ZBX のテキストログ監視でよくある質問について解説します。

本記事内での表記・用語について

表記・用語 解説
Zabbix Zabbix LLC 社が提供しているオープンソースの統合監視ソフトウェアを指します。
Zabbix として実装されている機能全般を指す場合にも本表記をします。
MIRACLE ZBX サイバートラスト株式会社が提供している Zabbix をベースとした監視ソフトウェアを指します。
Zabbix Server Zabbix / MIRACLE ZBX のサーバー機能がインストールされ稼働しているサーバーおよびその機能を指します。
Zabbix Proxy Zabbix / MIRACLE ZBX のプロキシ機能がインストールされ稼働しているサーバーおよびその機能を指します。
Zabbix Agent / Zabbix Agent 2 Zabbix / MIRACLE ZBX のエージェント機能がインストールされ稼働しているサーバーおよびその機能を指します。
特に指定がない場合は、Zabbix Agent 2 を含め「Zabbix Agent」と表記します。

Q1. MIRACLE ZBX のログ監視では、1 度の監視でどのくらいのログを取得できるのでしょうか。

1 度の監視処理で読み込むことができるログの量は、各種設定によって変更することが可能です。設定値が小さすぎるとログ監視に遅延が発生するためご注意ください。

MaxLinesPerSecond / Plugins.Log.MaxLinesPerSecond / maxlines

MaxLinesPerSecond は zabbix_agentd.conf 、 Plugins.Log.MaxLinesPerSecond は zabbix_agent2.conf で設定できるパラメータです。以降はまとめて「 MaxLinesPerSecond 」と呼称します。
maxlines は log[] や logrt[] アイテムの第三引数で設定できるパラメータです。省略した場合は MaxLinesPerSecond の値が参照されます。

ログ監視アイテムでログファイルを読み込む際に、 1 度の監視で読み込める行数や、 Zabbix Server / Zabbix proxy に送信できる行数の上限を設定することができます。上限に達した場合は、最後に読み込んだ行でログ監視が中止され、次回の監視タイミングでは次の行からログ監視が再開されます。

計算式は以下の通りとなります( MaxLinesPerSecond は適宜 Plugins.Log.MaxLinesPerSecond や maxlines に読み替えてください)。

  • 1 度の監視処理で読み込むことができるログの行数の上限
    MaxLinesPerSecond * 監視間隔 ( 秒 ) * 固定値※ = 読み込める上限 ( 行 )
  • 1 度の監視間隔で Zabbix Server / Zabbix Proxy に送信できるログの行数の上限
    MaxLinesPerSecond * 監視間隔 ( 秒 ) = 送信できる上限 ( 行 )

※ Zabbix 4.0 以降は 10 倍 、それ以前のバージョンでは 4 倍されます。

BufferSize / BufferSend

BufferSize と BufferSend は zabbix_agentd.conf / zabbix_agent2.conf で設定できるパラメータで、Zabbix Agent によるアクティブ監視で利用されます。

Zabbix Agent によるアクティブ監視では、Zabbix Agent が保持できるデータ個数の上限まで監視データを取得したタイミング、もしくは一定間隔で Zabbix Server / Zabbix Proxy に監視データを送信します。
BufferSize では保持できる監視データ個数の上限、BufferSend では監視データを送信する時間間隔を秒単位で設定できます。

ログ監視では 1 行のログを 1 個のデータとしてカウントし、BufferSize の半分の個数までしか保持できない仕様となっています。上限に達した場合は DebugLevel=3 以上の zabbix_agentd.log / zabbix_agent2.log に以下のログが出力されます。

buffer is full, cannot store persistent value

ログ監視で BufferSize の半分の行までログを取得した場合、その後の処理は Zabbix Agent と Zabbix Agent 2 で異なります。
Zabbix Agent の場合は、取得後に Zabbix Server / Zabbix Proxy にデータを送信し、後述する上限に達するまでログ監視が継続されます。
Zabbix Agent 2 の場合は、Zabbix Server / Zabbix Proxy にデータを送信した後はログ監視が中止され、次回の監視タイミングに再開されます。そのため監視タイミングごとに取得できるログは、BufferSize の半分か、MaxLinesPerSecond による送信上限までとなります。

Zabbix Agent / Zabbix Agent 2 のログ監視処理

Zabbix Agent / Zabbix Agent 2 のログ監視処理のフロー図

実際の動作について

実際のログ監視では、上述した 4 つの設定項目がどのように影響するかを説明していきます。今回は例として、以下のように設定している場合の動作を解説します。

各設定項目について

設定項目 設定値 説明
ログ監視アイテムの
監視間隔
30s デフォルト値は 1m ですが、説明をわかりやすくするために 30s とします。
BufferSend 5( 秒 ) 5 秒がデフォルト値となります。
BufferSize 100 / 1000 Zabbix Agent では 100 、Zabbix Agent 2 では 1000 がデフォルト値となります。
MaxLinesPerSecond 20( 行 ) 20 行がデフォルト値で、この場合の監視間隔 1 秒あたりの読込上限は 200 行、送信上限は 20 行になります。
今回は監視間隔が 30 秒なので、 1 度の監視処理での読込上限は 6000 行、送信上限は 600 行になります。
maxlines (省略) 設定していない場合は MaxLinesPerSecond の値が参照されます。
  1. MaxLinesPerSecond によって定められた上限までログを読み込む
    Zabbix Agent では、正規表現等を設定していない場合はすべてのログがマッチするので 600 行まで読み込まれます。一部のログのみがマッチするように正規表現等を設定している場合は、マッチするログが 600 行見つかるか、読込上限の 6000 行まで読み込まれます。
    Zabbix Agent 2 では、マッチするログが BufferSize の半分にあたる 500 行に到達するか、MaxLinesPerSecond によって定められた読込上限の 6000 行まで読み込まれます。
  2. 取得したログを BufferSize の半分の値まで、Zabbix Server / Zabbix Proxy に送信する
    Zabbix Agent は 50 行、Zabbix Agent 2 は 500 行まで送信します。
  3. Zabbix Agent のみ、取得したログを繰り返し送信する
    取得した 600 行のログを 50 行ずつ送信します。
  4. 次回監視タイミングまで待機

Q2. 過去に取得したログを再度取得しました。
原因と対策について教えてください。

Zabbix / MIRACLE ZBX のログ監視で新規ログファイルの読み込みを行う場合は、ファイルの先頭から読み込みます。特定の条件を満たした場合、Zabbix は既存のログファイルを新規ログファイルと判断して先頭から読み込み直すことがあります。

では、具体的にどのような原因でログの再読み込みが行われるかを解説します。基本的にログの再読み込みに関する処理は Zabbix Agent / Zabbix Agent 2 間で差異はありません。

・ファイルサイズが小さくなった

監視しているログファイルのファイルサイズが前回監視時よりも小さくなった場合、これまで読み込んでいたものとは別の新規ログファイルと判断され、先頭行から読み直します。

・更新日時は変更されたが、ファイルサイズが変わらない

logrt[] アイテムにて、監視しているログファイルの更新日時が変更されたものの、ファイルサイズが前回監視時と変わらない場合、これまで読み込んでいたものとは別の新規ログファイルと判断され、先頭行から読み直します。
このとき DebugLevel=3 以上の zabbix_agentd.log に以下のログが出力されます( XXX には監視対象ログファイル名が入ります)。

after changing modification time the size of log file "XXX" still has not been updated, consider it to be a new file

オプションで mtime-noreread オプションが指定されている( log[] アイテムではデフォルトで設定されます)場合は再読み込みは行われません。
このとき DebugLevel=3 以上の zabbix_agentd.log に以下のログが出力されます( XXX には監視対象ログファイル名が入ります)。

after changing modification time the size of log file "XXX" still has not been updated, consider it to be same file
・現在監視しているログファイルよりも、過去のログファイルのほうが更新日時が新しい

logrt[] では正規表現とマッチするログファイルをリストアップしたうえで、基本的には更新日時が最も新しいログファイルを読み込みます。ログローテートが行われたと判断した場合は、ローテート前の読み込んでいないログを読み込んだ後に、ローテート後のログファイルを先頭から読み込みます。

監視タイミングで、本来読み込むべきログファイルよりも過去のログファイルの更新日時が新しい場合は、過去のログファイルを先頭から読み直す仕様となっています。
採用しているログローテートの形式によっては、このような形でログの再読み込みが発生することがあります。その差異はログローテートの形式を見直すことや、監視タイミングをある程度長くすることで回避できる場合があります。

おわりに

ここまで Zabbix / MIRACLE ZBX のログ監視でよくある質問について解説しました。
今回解説した内容をもとに、現在の設定や監視状況に問題はないか再確認してみてください。

本記事に関連するリンク
CentOS 7 延長サポートサービス
デジタルトランスフォーメーションのための電子認証基盤 iTrust
iTrust SSL/TLS サーバー証明書