AWS
fluentd
S3
laravel
td-agent

td-agent3(Fluentd v1.0)でS3に「laravel.log」(複数行になるログ)を保存する。2018-06-28

内容

Laravelのログ ./storage/logs/laravel.logtd-agent を使ってS3に送る方法について記します。

laravel.log に関して言えば monologから出力したログをfluentdで集約する あたりが参考になりますが、今回はいろいろな事情から「テキストで出力された laravel.logtd-agent で送る」というところにこだわります。

ポイント

laravel.log にはstack traceが出力され複数行になることがあります。

[2018-06-28 03:21:38] local.DEBUG: <デバッグログ>
[2018-06-28 03:21:38] local.DEBUG: <デバッグログ>
[2018-06-28 03:21:38] local.ERROR: <エラー>
Stack trace:
#0 <trace #0>
#1 <trace #1>
#2 <trace #2>
[2018-06-28 03:21:39] local.DEBUG: <デバッグログ>

このような複数行に渡るログを td-agent で送るところがポイントです。

multiline Parser Plugin を使うと容易に設定できます。

準備

td-agent3(Fluentd v1.0)でS3にログを保存する を一通り設定した状態にする

設定例

設定ファイル

参考: multiline Parser Plugin

/etc/td-agent/td-agent.conf
# <source> の内容が本題
<source>
  @type tail
  path /ログが出ているPATH/laravel.log
  tag laravel.log
  pos_file /var/log/td-agent/laravel_log.pos

  <parse>
    @type multiline
    format_firstline /^\[2\d{3}-[01]\d-[0-3]\d [012]\d:[0-5]\d:[0-5]\d\]/
    format1 /^\[(?<time>2\d{3}-[01]\d-[0-3]\d [012]\d:[0-5]\d:[0-5]\d)\] (?<level>(.*?)): (?<message>.*)/
  </parse>
</source>

# <match> についての詳細は割愛
<match laravel.log>
  @type s3
  format json
  include_time_key true

  aws_key_id YOUR_AWS_KEY_ID
  aws_sec_key YOUR_AWS_SECRET_KEY
  s3_bucket YOUR_S3_BUCKET_NAME
  s3_region us-east-1
  path logs/${tag}/%Y-%m-%d/
  s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension}

  # if you want to use ${tag} or %Y/%m/%d/ like syntax in path / s3_object_key_format,
  # need to specify tag for ${tag} and time for %Y/%m/%d in <buffer> argument.

  <buffer tag,time>
    @type file
    path /var/log/td-agent/s3
    timekey 60
    timekey_wait 60
    chunk_limit_size 256m
  </buffer>
</match>

動作確認

以上の設定例で td-agent を起動してログ(/var/log/td-agent/td-agent.log)を確認します。
特に問題がなさそうであれば laravel.log に出力があるような処理をしてログを出します。

S3にログがたまっていく確認します。

ログデータの確認

今回の設定だと、S3に以下のようなテキストのログがたまっていきました。

YOUR_S3_BUCKET_NAME/laravel.log/2018-06-28/201806280321_0.gz
{"level":"local.DEBUG","message":"<デバッグログ>","time":"2018-06-28T03:21:38+00:00"}
{"level":"local.DEBUG","message":"<デバッグログ>","time":"2018-06-28T03:21:38+00:00"}
{"level":"local.ERROR","message":"<エラー>\nStack trace:\n#0 <trace #0>\n#1 <trace #1>\n#2 <trace #2>","time":"2018-06-28T03:21:38+00:00"}

まとめ

  • td-agent3Fluentd v1.0)で S3laravel.log を保存できました
  • td-agent3Fluentd v1.0)で S3 に 「複数行に渡るログ」 を保存できました