wata.dev

fluentdを使ってエラーログを取得、通知したい

全体の流れは、

  1. td-agent でログ収集
  2. fluentd-plugin-tail-multiline でログを読み込む(複数行可)
  3. fluentd-plugin-rewrite-tag-filter でエラーログ抽出、タグ書き換え
  4. fluent-plugin-record-reformer でホスト名を追加
  5. 何かしらの処理

です。

この例では「ChatWorkに通知」&「MySQLに保存」するところまで。

1. プラグインインストール

以下のプラグインを使用する。

※ 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>

ブログの記事一覧