読者です 読者をやめる 読者になる 読者になる

akms道東

ITイベント,勉強会への参加記録や趣味のことが書いてあるブログです.

td-agent でログ全文は S3 へ保存しつつ、特定文字列がマッチした場合 slack に通知する方法

はじめに

タイトルままの個人的な忘備録です。 td-agentのインストールなどはたくさん記事があるのでてけとーに見てください。 slack通知に利用したプラグインは以下のようにインストールしました。

td-agent-gem install fluent-plugin-slack

今回の設定は特定ログファイルを長期保管用にS3へアップロードしつつ、特定文字列を含むログが出力された場合、slackに通知するものです。

td-agentの設定ファイル

さっそく利用したtd-agentのコンフィグ例をもとに解説していきます。 そのままでは利用できませんので、適宜必要なところは書き換えてご利用ください。

sourceの設定

まずtd-agentを利用して保存したいファイルのソースを定義します。

今回はtailプラグインを使って読み込み続けて、変更があれば追従するようにしています。 またpos_fileを利用することで、何らかの理由でファイルが読み込めなくなった場合でも続きからロードできるようにしてあります。

<source>
  @type tail
  path TAIL_TARGET_FILE_PATH
  pos_file POS_FILE_PATH
  tag log
  format none
</source>

matchの設定

次に上記sourceから、S3に保存する用と、特定文字列をフィルターするためにラベル付けをする用にsourceで得たデータを分岐させて処理しています。

まずはS3にログのメッセージをそのまま、まとめて送信する設定です。

ここでformat single_valueにしているのはsourceからmessageがkeyとなっているものだけを抜き取り、そのまま送信するためです。 要はログをそのまま保存したいのでsingle_valueを使っています。

またS3への保存形式をstore_as textとすることで、text/plainでS3へ保存するようにしています。

次に2つめの処理で、sourceから渡ってきたデータにラベルを付与して、次のフィルターをするための処理に分岐させています。

<match log>
  @type copy
  <store>
    @type s3
    buffer_type file
    buffer_path BUFFER_FILE_PATH
    flush_interval FLUSH_INTERVAL_TIME
    s3_bucket TARGET_AWS_S3_BUCKET_NAME
    s3_region TARGET_BUCKET_REGION
    path "TARGET_S3_OBJECT_PATH"
    store_as text
    format single_value
    flush_at_shutdown
    time_slice_format
  </store>

  <store>
    type relabel
    @label @rewrite
  </store>
</match>

filter

さて、前のmatch処理でlabel着けをしたものに対して、実際にフィルタリングを行って、マッチしたもののみ、slackに通知するのは下記のような設定になります。

まず、filterセクションでフィルタリングをkeyがmessageのものに対して行います。

今回はfilterという文字列が含んでいるものだけ通知するようにしたいので、regexp1 message filterという設定になります。 その後、フィルターした文字列をslackの特定チャンネルに通知するための設定をmatchセクションに書いています。

これでログ全文を保存しつつ、特定文字列がマッチした場合slackに通知することができます。

<label @rewrite>
  <filter>
    @type grep
    regexp1 message filter
  </filter>
  <match>
    @type slack
    webhook_url https://YUOUR_SLACK_API_URL
    channel CHANNEL_NAME
    username USERNAME
    icon_emoji :ICON_EMOJI:
    flush_interval FLUSH_INTERVAL_TIME
    flush_at_shutdown
  </match>
</label>

設定全文

ここまでの設定を一つにまとめたものを下記に記載しておきます。 設定の説明の最初にも記載しましたが、このままでは利用できないので適宜書き換えて利用していただければと思います。

<source>
  @type tail
  path TAIL_TARGET_FILE_PATH
  pos_file POS_FILE_PATH
  tag log
  format none
</source>

<match log>
  @type copy
  <store>
    @type s3
    buffer_type file
    buffer_path BUFFER_FILE_PATH
    flush_interval FLUSH_INTERVAL_TIME
    s3_bucket TARGET_AWS_S3_BUCKET_NAME
    s3_region TARGET_BUCKET_REGION
    path "TARGET_S3_OBJECT_PATH"
    store_as text
    format single_value
    flush_at_shutdown
    time_slice_format
  </store>

  <store>
    type relabel
    @label @rewrite
  </store>
</match>

<label @rewrite>
  <filter>
    @type grep
    regexp1 message filter
  </filter>
  <match>
    @type slack
    webhook_url https://YUOUR_SLACK_API_URL
    channel CHANNEL_NAME
    username USERNAME
    icon_emoji :ICON_EMOJI:
    flush_interval FLUSH_INTERVAL_TIME
    flush_at_shutdown
  </match>
</label>

おわりに

簡単ですが、タイトル通りの用途の設定をまとめました。

td-agent簡単に設定できて、便利なのでこれからもどんどん使っていきたい。