■Zabbixの文字列解析について
Zabbixのアイテムのキーの文字列解析やstrやregexpの引数の文字列解析ですが、Zabbix独自の文字列解析が行われています。
文字列解析はマニュアルの「1 アイテムキー」の「キーのパラメータ」で書いてある通り、下記の3つがあります。
- 引用符付き文字列
- 引用符なし文字列
- 配列
下記はZabbix2.2マニュアルのリンク
1 アイテムキー
配列時はカンマ(,)が区切り文字として使用されるので、下記のキーの場合、file~がパラメータ配列と解析されます。
log[file,<regexp>,<encoding>,<maxlines>,<mode>,<output>]
個々のパラメータはダブルクォーテーション(")で括られている時は「引用符付き文字列」、それ以外は「引用符なし文字列」として解析されます。
注意が必要なのはシングルクォーテーション(')は引用符として解析されないという点です。
また、「引用符なし文字列」文字列ではカンマ(,)と右角括弧(])が使用できないと書かれています。
これは、カンマ(,)は区切り文字、右角括弧(])は配列の終わりと判断される為です。
その為、パラメータ内でカンマ(,)や右角括弧(])を使用する場合はダブルクォーテーション(")で括る必要があります。
どんな時にカンマ(,)や右角括弧(])を使うかと言えばに正規表現を指定する時が多いのではないでしょうか?
正規表現でもカンマ(,)や右角括弧(])を使わない時はダブルクォーテーション(")で括る必要はないのですが、例外で覚えるのが面倒なので「正規表現はダブルクォーテーション(")で括る」と覚えていた方が楽だと思います。
尚、パラメータで「引用符付き文字列」を使う場合、ダブルクォーテーション(")はバックスラッシュでエスケープする必要があります。
で、この文字列解析ですが、実はトリガーでも使われてます。A(^_^;
その為、トリガーをhoge.str([ERROR])と書くと[ERROR]は配列パラメータと認識され、「ERROR」と言うキーワードが出力されればヒットしてしまいます。
この動作を避けるためにはhoge.str("[ERROR]")の様に「引用符付き文字列」で指定する必要があります。
※:regexp、iregexpも同様です。
■Zabbixの正規表現について 【Zabbix3.4未満】
Zabbixが使える正規表現はマニュアルにも書かれていますがPOSIX拡張形式になります。
下記リンクに分かりやすい表があるのですが、「角かっこ[]の中」で使えないものが沢山あるのが分かります。
正規表現・ワイルドカード
ここで注意が必要なのですが、ZabbixのWebインタフェースの正規表現チェックですが、PHPのPOSIX 正規表現関数がPCRE対応なのでPOSIX拡張形式じゃなくても通ります。A(^_^;
どうすればPOSIX拡張形式でチェックできるかと言うと…
下記リンクの「拡張正規表現モードの正規表現」に書いてある通り、grepコマンドに-Eオプションを指定するとPOSIX拡張でチェックができます。
grepによる正規表現と’-E’をつけた拡張正規表現の違い(and sed)
下記はgrepコマンドのhelp抜粋。
]# grep --help
Usage: grep [OPTION]... PATTERN [FILE]...
Search for PATTERN in each FILE or standard input.
PATTERN is, by default, a basic regular expression (BRE).
Example: grep -i 'hello world' menu.h main.c
Regexp selection and interpretation:
-E, --extended-regexp PATTERN is an extended regular expression (ERE)
-F, --fixed-strings PATTERN is a set of newline-separated fixed strings
Zabbix3.4からはPCRE拡張正規表現のライブラリを使用する変更が入っております。