複数のログファイルをtd-agentを使ってCloudWatch Logsに送る時にログファイル名をログストリーム名にする方法

ひと手間加える必要があったのでメモ。

バージョン

  • td-agent v3.8.1
  • fluent-plugin-cloudwatch-logs v0.13.0

方法

まずファイル名をタグに入れるために、 tagワイルドカードを指定する。こうすることで、フルパスが tag の末尾に追加される。(デリミタは . に変換される)

<source>
  @type tail
  format none
  pos_file /path/to/pos/foobar.pos
  path /path/to/log/*.log
  read_from_head true
  tag log.*
</source>

次に record_transformer を挟んでレコードにストリーム名を追加する。tail でタグにフルパスを含めたので、ファイル名の部分以降を tag_suffix で抜き出して指定する。

<filter log.**>
  @type record_transformer
  <record>
    stream_name ${tag_suffix[4]}
  </record>
</filter>

何故レコードにストリーム名を追加するかと言うと、 fluent-plugin-cloudwatch-logs には log_stream_name_key と言うオプションがあり、ここで指定したキーの値をストリーム名に使うことが出来るため。ストリーム名に使ったキーをCloudWatch Logsに残したくない場合は remove_log_stream_name_key も有効にする必要がある。

<match log.**>
  @type cloudwatch_logs
  log_group_name foobar
  log_stream_name_key stream_name
  remove_log_stream_name_key true
  auto_create_stream true
</match>

他にも use_tag_as_stream と言うオプションがあるが、これはタグすべてをストリーム名に使ってしまう。ファイル名だけにしたい場合は使うことが出来ない。