ログ監視をおこなう

公式チェックプラグイン集の check-log を使ってログ監視をおこなうことができます。公式チェックプラグイン集のインストールは、チェック監視に公式チェックプラグイン集を使う をごらんください。

check-log の使い方

check-logを使ってログ監視をおこなうためには例えば以下のように mackerel-agent.conf に記述し、mackerel-agentを再起動します。

[plugin.checks.access_log]
command = "check-log --file /var/log/access.log --pattern FATAL"

--file オプションに監視対象のファイルを、--pattern オプションに、エラー文言を検出したいパターンを正規表現で指定します。この場合、ログファイルに "FATAL" という文字列が出現した場合にアラートが発生します。

--pattern オプションは複数指定することができ、その場合 AND 条件(指定された全てのパターンを満たすログ出力行のみ検出)として扱われます。以下の例は、 "PRODUCTION" と "FATAL" という2つの文字列が含まれるログ出力行が出現した場合にアラートを発生させる場合の設定例です。

[plugin.checks.access_log]
command = "check-log --file /var/log/access.log --pattern PRODUCTION --pattern FATAL"

--pattern には、日本語(マルチバイト文字)を指定することもできますが、その場合には conf ファイルの文字コード(エンコーディング)が UTF-8 である必要があります。

--file オプションには、glob形式でチェック対象を指定することもできます。

[plugin.checks.access_log]
command = "check-log --file /var/log/*.log --pattern FATAL"

また、--file-pattern オプションにより監視対象としたいファイル名の条件を正規表現で指定することも可能です。

[plugin.checks.access_log]
command = '''
check-log --file-pattern /var/log/access.log.\\d{4}-\\d{2}-\\d{2} \
--pattern FATAL
'''

mackerel-agentは定期的にcheck-logを実行しますが、前回実行時までにチェックした行はスキップされます。実行間隔は check_interval参照)で指定された間隔(デフォルト1分)です。

ログローテーションが発生した場合、ログは冒頭から読み直されます。正確には、前回チェック時よりもファイルサイズが小さくなっている場合にログローテーションが発生したとみなし、冒頭から読み直す挙動となっています。

エラー行の内容をMackerel上で確認したい

コマンドに --return オプションを付加することで、エラー行が出力され、その内容がMackerelに送信されます。ご利用の際には秘匿情報などが意図せず送信されないようにご注意下さい。

また、送信内容のサイズが大きい場合、表示が切り詰められることがあります。

発生頻度に対する閾値や除外パターンを指定する

エラー文言が1回だけ出る分には問題ないが、頻発した場合にアラートを上げたいケースに対しては以下のオプションが有用です。

  • -w, --warning-over
    • 設定値より多くエラー行が検出された場合にwarning
  • -c, --critical-over
    • 設定値より多くエラー行が検出された場合にcritical

また --exclude オプションを指定することで、除外パターンを指定することが可能です。

例えば以下の設定ではNginxのアクセスログを監視して、4xxや5xxのエラーの発生をチェックしています。

--exclude を指定することで"robots.txt"へのアクセスは除外するようにしています。また、 --warning-over, --critical-over を指定することで、1分間に3回より多く出現したらWarning、10回より多く出現したらCriticalになるように設定しています。

[plugin.checks.access_status]
command = '''
  check-log                      \
    --file /var/log/nginx/access.log            \
    --pattern 'HTTP/1\.[01]" [45][0-9][0-9] '   \
    --exclude 'GET .*?robots\.txt HTTP/1\.[01]' \
    --warning-over 3 --critical-over 10         \
    --return
'''

一つのログに対して複数のチェック監視を設定したい

check-log は前回のチェックまでに読んだログの位置をステートファイルに保存しています。ステートファイルはデフォルトでは /var/tmp/mackerel-cache/check-log 以下に保存されます。同じログファイルに対して複数のチェック監視を設定する場合には、以下のように --state-dir を指定して、別の場所にステートファイルを保存するようにして下さい。

[plugin.checks.access_status5xx]
command = '''
  check-log                     \
    --file /var/log/nginx/access.log           \
    --pattern 'HTTP/1\.[01]" 5[0-9][0-9] '     \
    --state-dir /var/tmp/mackerel-cache/check-log2
'''

その他のオプションに関しては check-log --helpREADME をご確認下さい。

ソースコードについて

check-logのソースコードは以下に公開されています。

https://github.com/mackerelio/go-check-plugins/tree/master/check-log