fluentdを使ってエラーログを取得、通知したい
全体の流れは、
td-agentでログ収集fluentd-plugin-tail-multilineでログを読み込む(複数行可)fluentd-plugin-rewrite-tag-filterでエラーログ抽出、タグ書き換えfluent-plugin-record-reformerでホスト名を追加- 何かしらの処理
です。
この例では「ChatWorkに通知」&「MySQLに保存」するところまで。
1. プラグインインストール
以下のプラグインを使用する。
- fluent-plugin-tail-multiline(複数行に対応したtail)
- fluent-plugin-rewrite-tag-filter(フィルタリング、タグ書き換え)
- fluent-plugin-record-reformer(レコードにちょっとした処理をしてフィールドを追加する)
- fluent-plugin-mysql(mysqlクライアント)
- fluent-plugin-chatwork(ChatWork APIを使った通知)
※ fluent-plugin-chatwork はgemに無いので、gistから持ってきて自分で配置してください
$ /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-tail-multiline
$ /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-rewrite-tag-filter
$ /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-record-reformer
$ /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-mysql
# fluent-plugin-chatwork
# https://gist.github.com/wata/9612659
2. td-agent.conf の設定
# フォーマットを指定してログを読み込む
<source>
type tail_multiline
path /var/log/example/app.log
format /^(?<time>\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}),\d{3}\s{1,2}(?<level>[^ ]+) (?<message>.*)$/
tag example.app
pos_file /var/tmp/app_example.pos
</source>
# tail_multilineから渡されたレコードのlevelフィールドを見て、タグを書き換える
<match example.app>
type rewrite_tag_filter
rewriterule1 level ERROR example.app.err
</match>
# ここを経由することでレコードにホスト名を含ませたい
<match example.app.err>
type record_reformer
renew_record false
enable_ruby false
output_tag reformed.${tag}
<record>
hostname ${hostname}
</record>
</match>
# 整形したレコードをmysqlの専用テーブルに格納
<match reformed.example.app.err>
type mysql
host example.com
database example
username xxxx
password xxxxxxxx
include_time_key yes
time_format %Y-%m-%d %H:%M:%S
include_tag_key yes
table app_log
key_names hostname,level,message,time,time,tag,tag
columns HOST,LEVEL,MESSAGE,INS_DATETIME,UPD_DATETIME,INS_TRACE,UPD_TRACE
</match>
# 併せてchatworkの任意のルームにも通知
<match reformed.example.app.err>
type chatwork
api_token xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
room xxxxxxxx
proxy http://x.x.x.x:xxxx
title :(
</match>