この記事は?
- Zabbixにおけるログ監視では正規表現を用いたフィルタリングができる。
- Zabbix2.2からはフィルタリングしたログからさらに出力データを抽出できるようになった。
- が、この正規表現が曖昧だったがゆえに思ったとおりに動かない場合があるので共有します
Zabbixのログ監視
ログ監視の監視設定フォーマット
詳細については Zabbix3.4におけるWEBマニュアル を参照してください。
log[file,<regexp>,<encoding>,<maxlines>,<mode>,<output>,<maxdelay>]
or
logrt[file,<regexp>,<encoding>,<maxlines>,<mode>,<output>,<maxdelay>]
パラメータ | 必須/任意 | 設定内容 |
---|---|---|
file | 必須 | ログ監視のファイル名をフルパスで指定。 |
regexp | 任意 | フィルタリングする文字列を正規表現で指定。 |
encoding | 任意 | 文字コードを指定。Linuxであればiconv -l の結果から、Windowsであれば Code Page Identifiers のIdentifierか.NET Nameを指定する。 |
maxlines | 任意 | zabbix_agentdが読み取り/送信するログの最大行数の制限。zabbix_agentd.confのMaxLinesPerSecondの値をオーバーライドする。 |
mode | 任意 | all、もしくはskipを指定することで、監視データをどこから読み取るかの指定を行う。デフォルトはall。 |
output | 任意 | regexpにてグループ化された場所を\0,\1,\2 .. \9までに区分し、出力する。 |
maxdelay | 任意 | 大量にログが発生した場合などにログ遅延が発生することを防ぐため、最新のログの時間+指定時間までのログを遅延が発生しないよう、読み飛ばすようにする時間を指定する |
outputの指定で何ができるか
@atanaka7さんの記事 Zabbix 3.0の新機能:ログファイルから数値を取得 でも紹介されているように、
ログの切り出しや、ログから数値型データの取得・グラフ化ができるようになりました。
私はBIND(DNS)のログ監視などに、結構使っています。
で、正規表現が厳密でないとどうなるの?
たとえば、こんなログが出力されると…
zabbix_agent.confにおけるEnableRemoteCommandsとLogRemoteCommandsを有効化(1)にし、
zabbix_getにて次のsystem.runアイテムの取得をします。
$ zabbix_get -s ServerName -p 10050 -k "system.run[echo Msg01 Msg02 Msg03 Msg04 Msg05 Msg06 Msg07 Msg08 Msg09 Msg10 Msg11 Msg12,wait]"
すると、zabbix_agentd.logには次のようにログ出力されます。
3644:20170111:160652.658 Executing command 'echo Msg01 Msg02 Msg03 Msg04 Msg05 Msg06 Msg07 Msg08 Msg09 Msg10 Msg11 Msg12'
監視設定を行い、フィルタリングして拾います
フィルター条件として、「echo (.*) (.*) (.*) (.*) (.*) (.*) (.*) (.*) (.*) (.*)」と大雑把な設定をしてみます。
outputを指定する前段階では、次のように取得できています。
想定では…?
次のようになるつもりでした。
output | 取得値 |
---|---|
\0 | echo Msg01 Msg02 Msg03 Msg04 Msg05 Msg06 Msg07 Msg08 Msg09 Msg10 Msg11 Msg12' |
\1 | Msg01 |
\2 | Msg02 |
\3 | Msg03 |
\4 | Msg04 |
\5 | Msg05 |
\6 | Msg06 |
\7 | Msg07 |
\8 | Msg08 |
\9 | Msg09 Msg10 Msg11 Msg12 |
実際はこうなった
結果をドン。
output | 取得値 |
---|---|
\0 | echo Msg01 Msg02 Msg03 Msg04 Msg05 Msg06 Msg07 Msg08 Msg09 Msg10 Msg11 Msg12' |
\1 | Msg01 Msg02 Msg03 |
\2 | Msg04 |
\3 | Msg05 |
\4 | Msg06 |
\5 | Msg07 |
\6 | Msg08 |
\7 | Msg09 |
\8 | Msg10 |
\9 | Msg11 |
結果として
どうにも前からパースしてくれているのだと思い込んでいましたが、
どうやらZabbixで使用している正規表現エンジンは後ろからパースするようで、
Msg01から順番に区切ってくれていなかった。
もし一行のログから複数のデータを取得したい場合には、
「ある程度正規表現を厳密にして、そもそものログデータの範囲を絞る」
「後ろからパースされることを気にしつつグループ化する」
ということを頭の片隅においておくといいかもしれない。
以上