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簡単に設定できて、便利なのでこれからもどんどん使っていきたい。