サイトアイコン IT NEWS

【Zabbix】logrtでローテーションするログファイルを監視

Zabbixログファイル監視をするには、log[]logrt[]アイテムキーを使用します。
Linuxの場合だと、主にSyslog(シスログ)と言われるシステムログを監視する際に利用されます。
またログの中でも、特にローテーションするログについてはいくつか注意点がありますので、Zabbix監視を設定する前にぜひ本記事を確認してください。

logrt[]キーの基本的な使い方

ログファイル監視

冒頭で2種類のアイテムキーを記載しましたが、今回はローテーションするログ監視をしますので、logrt[]アイテムキーを中心に説明していきます。

Zabbixのログファイル監視設定

まずは、アイテムのタイプを「Zabbixエージェント(アクティブ)」を設定します。
そして、ログファイル監視に使用するlogrt[]キーの基本的な使い方はについては以下の通りです。

logrt[file_regexp,<regexp>,<encoding>,<maxlines>,<mode>,<output>,<maxdelay>,<options>,<persistent_dir>]

logrt[]キーの詳しい使い方とパラメータについては、公式サイトでご覧ください。

中でも特に注目していただきたいのが第1引数file_regexです。
log[]キーとは異なり、ファイル名に正規表現が使えます!
正規表現を使うことにより、ローテーションされたファイルも見逃さずに監視することができます。

その他、比較的使用頻度の多いの引数としては、<encoding>文字コードを指定、それから<mode>skipを指定することで、監視開始時のログの読み込みをスキップするくらいだと思います。

Zabbixのログファイル監視の仕組み

例えば、間隔を空けず常に出力され続けるログファイルがあるとします。
そのログファイルを、Zabbixlog[]キーを使用して監視を行い、仮に監視間隔が30秒だったとしましょう。
すると、Zabbixエージェントは以下のようにログファイルからデータを収集して、Zabbixサーバーに対して監視データを送信します。

アイテムの監視間隔
30秒間隔
0秒
30秒
60秒
90秒
120秒
・・・

そこで、上記の30秒毎の監視と監視の間にローテーションが行われたとすると、古いログファイルは読み込まなくなるのでログを見逃す(読み飛ばす)可能性があります。
しかし、logrt[]キーの場合は前述の通りローテーションされる前のファイルも読み込むので、ローテーションによる見逃しを防止することができます。

Zabbixがローテーションを検知する条件

では、Zabbixがどのようにしてローテーションしたログファイルも見逃さずに監視ができるかを説明します。
Zabbixログファイルの以下のいずれかの状態に変化があった場合、ローテーションされたことを検知します。

状態変化
サイズファイルサイズが増えた、または減った場合
(減った場合はファイルの先頭から読み直します)
更新日時ファイルの更新日時が変わった場合
inodeいわゆる一意のIDのようなもの。
ファイル名が同じでもファイルそのものが変わった場合
ログファイルの状態と変化

また、Zabbixはこれらの情報を基に、ログファイルどこまで読み込んだかを記録しています。

ログファイルのローテーション方式を確認

始めにZabbixでのログファイル監視の設定をご紹介しましたが、それ自体は特に難しいこともありません。
しかし、ログファイル監視でしばしば問題になるのは、今から説明するログファイルのローテーション方式と、その後にご紹介するログファイルの圧縮方式です。
まず、ローテーション方式から順を追って説明していきます。

ローテーション方式の種類

ここでのログファイルローテーション方式の種類とは、ログファイルがローテーション後に新しく生成されるログファイル、及び、ローテーションする前のログファイルをどう扱うかというものです。
一般的によく利用されるローテーション方式は、以下の3つのオプションだと思います。

スクロールできます
ローテーション方式説明
createローテーションが行われた直後に新しいログファイルを作成する。
所有者やパーミッションを指定する。
省略した場合は元のログファイルと同じ属性を使用する。
copyログファイルのコピーを生成し、元のログファイルは変更なし。
copytruncate元のログファイルをリネームし、コピー元のログファイルを空にする。
ログのローテーション方式

copytruncateが対応したのがバージョン3.2や4.0だったのは、まだ記憶に新しいですね。
logrotateには、他にも様々なオプションがありますので、気になる方はこちらの参考サイトをご覧ください。

Zabbixログファイル監視で特に問題になるのは、createオプションで設定している場合です。

所有者やパーミンションに注意!

logrotateローテーション方式copycopytruncateの場合は、所有者パーミンションが変わることはありませんが、createの場合はlogrotateの指定した所有者やパーミッションで新しくファイルを作成するので、設定次第ではローテーション後にログが読めなくなることがあります。

ログファイルはデフォルトで所有者rootで、パーミッション600が一般的だと思いますが、Zabbixは基本的にzabbixユーザー監視をするので、zabbixユーザーが読める権限でなければなりません。

所有者を変更すると色々問題が、かと言って、権限を緩くし過ぎるのもセキュリティ的に問題がありますので、おすすめはパーミッションだけ640もしくは644に設定する程度で良いと思います。

# 設定例
/var/log/syslog {
    ・・・
    create 644 root root
}

ちなみに、logtotateで設定した内容はローテーションしないと適用されませんので、Zabbixログファイル監視を始める前に、既存のログファイルのパーミッションも変更しておきましょう!

# chmod 644 /var/log/syslog*

この時、Zabbix正規表現にマッチしたログファイルを全て読み込むので、過去にローテーションされて圧縮されたログファイルも全て変更しておきます。

ログファイルの圧縮方式を確認

もう1つ、Zabbixログファイル監視で問題になるのは、ログファイル圧縮方式です。
ログファイル圧縮方式とは、ローテーションした際にログファイルを圧縮するかしないか、また圧縮する場合はどのタイミングで圧縮するかです。

圧縮方式の種類

圧縮方式logrotateオプションで、圧縮の有無やタイミングを設定することができます。
一般的によく利用される圧縮方式は、以下の3つのオプションだと思います。
※上記の参考サイトを参照

スクロールできます
圧縮方式説明
nocompressローテションされたファイルは圧縮しない
compressローテーションされたファイルは直ちに圧縮する
delaycompressローテションされたファイルは次回以降のローテーション時に圧縮する
ログファイルの圧縮方式

Zabbixログファイル監視で問題になるのは、compressオプションで設定している場合です。

圧縮するタイミングに注意!

ローテーション圧縮される際、一般的には~.gz形式で圧縮されます。
当然、通常のテキストファイルではなく圧縮ファイルになりますので、Zabbixが正常に読み込むことができず文字化けしてしまいます。

つまり、上記で説明したZabbixログファイル監視の仕組み上、compressオプションを使用していると、ローテーションされた直後に圧縮されたログファイルも読み込むので、監視データ文字化けしてしまいます。
また、logrt[]キーの<mode>引数にskipを指定しなかった場合も、現在存在している全ての圧縮ファイルも読み込み文字化けした大量の監視データを受け取ることになりますので注意が必要です。

もちろん、ログファイルを圧縮しなければこの問題は起こりませんが、圧縮しなければディスクの容量を圧迫してしまいますので、おすすめはdelaycompressオプションを設定することです!

# 設定例
/var/log/syslog {
    ・・・
    delaycompress
}

delaycompressオプションを設定しておけば、ローテーションしても1世代前のログファイルは即時圧縮されず、次回のローテーションの際に圧縮するので文字化けを回避できます。

Zabbixのアイテムとlogrotateの設定まとめ

最後に、Zabbixローテーションするログファイル監視とlogrotateのおすすめ設定をまとめました。
今回はトリガーの設定を割愛させていただきます。

Zabbixのログファイル監視設定

冒頭でも紹介したlogrt[]キーを使います。
タイプは必ず「Zabbixエージェント(アクティブ)」で設定します。
ポイントはログファイル名の指定に正規表現が使えること、あとskipはほぼ必死でしょうね。

スクロールできます
設定項目設定値説明・注意点
名前<ログファイル監視>(任意の名前)
タイプZabbixエージェント(アクティブ)Zabbixエージェント(アクティブ)のみ
キーlogrt[/var/log/syslog,error,,,skip]オプションが不要な場合は省略可
データ型ログログ固定
監視間隔<30s>(任意の間隔。トリガーも考慮する)
ログファイル監視

もし、特にWinodws上のログファイルを監視する場合は文字コードにご注意ください。
監視間隔は、長いほど1度にZabbixサーバーへ送信するデータ量が多く、<maxlines>オプションも考慮する必要が出てきますので、極端な話、1秒に設定していても問題ありません。

ログファイルとlogrotateの設定

Zabbixログファイル監視を行うには、ログローテートの適切な設定が必要です。
まず、ログファイルのパーミッションの設定を行います。

# chmod 644 /var/log/syslog*

次に、logrotateの設定を確認します。
Zabbixユーザー読み込み可能なパーミッションであること、そして、ローテーションの際に即時圧縮しないことを確認してください。

/var/log/syslog {
    ・・・
    delaycompress
    create 644 root root
}

以上です!
これで、ログファイル監視に関するある程度の問題は解消できるはずです。

モバイルバージョンを終了