Apache のエラーログを slack に送る

Posted: , Modified:   Apache slack fluentd Qiita

本稿は Qiita 投稿記事 のバックアップです.

はじめに

ようやく slack を使い始めたので,手始めに Apache のエラーログを転送してみる. ほぼ ここ にある通りで動作するが, 多少変更した部分もあるので備忘録も兼ねてまとめておく.

準備

ログの収集・転送には fluentd を使う.fluentd はインストールされているものとして, 今回必要となるプラグインをそれぞれインストールする.

$ sudo td-agent-gem install fluent-plugin-slack
$ sudo td-agent-gem install fluent-plugin-rewrite-tag-filter
$ sudo td-agent-gem install fluent-plugin-record-reformer

また,apache のログが置かれている /var/log/apache2 へのアクセスは root 権限が必要になっている. そのため,fluentd の実行ユーザを root に変更しておく. Ubuntu の場合,/etc/init.d/td-agent を開き td-agent から変更する (参考).

# TD_AGENT_USER=td-agent
# TD_AGENT_GROUP=td-agent
TD_AGENT_USER=root
TD_AGENT_GROUP=root

CentOS の場合,/etc/sysconfig/td-agent に下記を追加する.

TD_AGENT_USER=root
TD_AGENT_GROUP=root

fluentd の設定

次に fluentd の設定を行う.使った設定は下記の通り.

####
## Source descriptions:
##

## apache error log.
<source>
  type tail
  format /^\[(?<time>[^\]]*)\] \[(?<level>[^\]]*)\] \[client (?<client>[^\]]*)\] (?<message>.*)$/
  time_format %a %b %d %H:%M:%S %Y
  pos_file /tmp/td-agent/httpd_error_log.pos
  path /var/log/httpd/error_log
  tag httpd.error_log
</source>

####
## Edit descriptions:
##
<match httpd.error_log>
  type rewrite_tag_filter
  rewriterule1 level error slack.${tag}
</match>

<match slack.**>
  type record_reformer
  tag reformed.${tag}
  <record>
    source_id ${tag_suffix[1]}
  </record>
</match>

####
## Output descriptions:
##
<match reformed.slack.**>
  type slack
  webhook_url <slack の設定からコピー>
  channel admin
  username fluentd
  title_keys source_id
  title %s
  color danger
  flush_interval 5s
</match>

どのサーバから来たエラーなのかタイトルに入れて表示しようと思い, 初めはホスト名をタグに含めてタグからタイトルを構成しようとしていた. だが,slack プラグインはタグのプレースホルダに対応していないようなので, record_reformer プラグインで source_id を追加することにした.

あと,ログと日付のフォーマットは環境によって異なるので, 拾ってきた値をそのまま使うとエラーの原因になる.

format /^\[(?<time>[^\]]*)\] \[(?<level>[^\]]*)\] \[client (?<client>[^\]]*)\] (?<message>.*)$/
time_format %a %b %d %H:%M:%S %Y

エラーが出る場合は上記の設定を適切なものに変更する.