5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Zabbixのログ監視にてoutput指定をした場合、regexpには厳密に正規表現を書いたほうがいいよ、という話

Last updated at Posted at 2017-01-11

この記事は?

  • 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を指定する前段階では、次のように取得できています。
Capt1.PNG

想定では…?

次のようになるつもりでした。

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

実際はこうなった

結果をドン。

Capt2.PNG

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から順番に区切ってくれていなかった。
もし一行のログから複数のデータを取得したい場合には、
「ある程度正規表現を厳密にして、そもそものログデータの範囲を絞る」
「後ろからパースされることを気にしつつグループ化する」
ということを頭の片隅においておくといいかもしれない。


以上

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?