FluentD 上传新文件,而不是将旋转文件上传到 s3 以进行日志文件的每小时日志轮换

FluentD uploads new file, instead of rotated file to s3 for hourly log rotation of log files

我们有一个 python 应用程序可以生成每小时轮换的日志,我们已将每次轮换的时间设置为每小时的开始,即日志轮换将发生在 10:00,11:00, 12:00 .... 应用部署在Kuberenetes pod中,使用FluentD作为side-car容器,将这些日志文件上传到S3 bucket,路径为

s3bubcket/<id>/logs/%Y-%m-%d/%H/metrics

所以我们正在尝试为一天中的每个小时创建不同的文件夹,并将该小时的日志上传到存储桶中。 在 FluentD 中,我们分别将上传间隔设置为 60 秒和 30 秒,但每次(例如 10:00)FluentD 都会上传新的小时生成的日志文件(目前为空白或有一些 10:00 的日志)将 Amazon S3 存储桶放入前一小时的文件夹(即 9:00),从而覆盖前一小时的日志(在我们的例子中是 9:00 到 9:59:59 的日志)。

我们尝试使用 timekey 为 60 秒和 30 秒,delaying/increasing 日志轮换时间和其他设置 (rotate_wait, refresh_interval, ) 以在下一个小时开始前上传在适当的文件夹中,但延迟会导致覆盖日志,增加时间会导致日志丢失。

fluentd 日志:

2022-04-06 10:59:00 +0000 [warn]: #1 def7zme94qc7q9folg5zly641/endpoints/p5wspkd85sr61/mep/2022-04-06/10/meplogs/logs_10.gz already exists, but will overwrite
2022-04-06 10:59:31 +0000 [warn]: #1 def7zme94qc7q9folg5zly641/endpoints/p5wspkd85sr61/mep/2022-04-06/10/meplogs/logs_10.gz already exists, but will overwrite
2022-04-06 10:59:57 +0000 [info]: #1 detected rotation of /var/log/cluster-env/gateway.log; waiting 120.0 seconds
2022-04-06 10:59:57 +0000 [info]: #0 detected rotation of /var/log/cluster-env/gateway.log; waiting 120.0 seconds
2022-04-06 10:59:57 +0000 [info]: #1 following tail of /var/log/cluster-env/gateway.log
2022-04-06 10:59:57 +0000 [info]: #0 following tail of /var/log/cluster-env/gateway.log
2022-04-06 10:59:57 +0000 [info]: #1 following tail of /var/log/cluster-env/gateway.log.2022-04-06_09
2022-04-06 11:00:01 +0000 [warn]: #1 def7zme94qc7q9folg5zly641/endpoints/p5wspkd85sr61/mep/2022-04-06/10/meplogs/logs_10.gz already exists, but will overwrite

所以即使时间是 11:00:01 日志也会上传到第 10 个小时的文件夹。

日志的 FluentD 配置

<worker 1>
    <source>
      tag "gateway-s3-logs"
      @label @gateway-s3-logs
      @type tail
      path "/var/log/cluster-env/gateway.log"
      pos_file "/var/log/cluster-env/gateway.log-s3-container-log-in-tail.pos"
      read_from_head true
      follow_inodes true
      refresh_interval 5
      rotate_wait 120
      <parse>
        @type "none"
        unmatched_lines 
      </parse>
    </source>
    <label @gateway-s3-logs>
      <match gateway-s3-logs>
        @type s3
        s3_bucket "sranjha-log-test"
        s3_region "us-west-2"
        path "def7zme94qc7q9folg5zly641/endpoints/p5wspkd85sr61/mep/%Y-%m-%d/%H/meplogs"
        s3_object_key_format "%{path}/logs_%H.gz"
        check_apikey_on_start false
        overwrite true
        utc 
        <buffer time>
          @type "file"
          path "/tmp/fluentd/mep-logs/logs/out-s3-buffer*"
          chunk_limit_size 64MB
          flush_at_shutdown true
          timekey 30
          timekey_wait 0
          retry_timeout 30s
          retry_type exponential_backoff
          retry_exponential_backoff_base 2
          retry_wait 1s
          retry_randomize true
          disable_chunk_backup true
          retry_max_times 5
        </buffer>
        <local_file_upload>
          file_path "/var/log/emr-on-cluster-env/gateway.log"
        </local_file_upload>
        <secondary>
          @type "secondary_file"
          directory "/var/log/fluentd/error/"
          basename "s3-mep-error.log"
        </secondary>
        <format>
          utc 
          localtime false
        </format>
        <inject>
          localtime false
        </inject>
      </match>
    </label>
  </worker>
  <worker 1>

那么,有没有一种方法可以让 fluentd 将 hh:59:59 之前的文件写入前一小时 (hh) 文件夹以及从 (hh+1:00:00) 写入新一小时 (hh + 1) 文件夹。

这是我们每分钟向 s3 发送日志的配置。

  type s3
<template>
 s3_bucket "mybucket"
 s3_region "my_region"
 path my_path/
 s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension}
 time_slice_format ${tag}/YEAR=%Y/MONTH=%m/DAY=%d/HOSTNAME=${hostname}/HOUR=%H/%M
<format>
 @type json
</format>
 store_as gzip
<buffer time>
 timekey 30
 @type file
 path /var/log/td-agent/buffer/s3/${tag}
 timekey_wait 1m
 chunk_limit_size 50m
 flush_at_shutdown true
</buffer>
</template>

我们获得的最后日志的格式为 59_1.gz,并且此 gzip 中的最后一条消息位于 "2022-04-07T18:59:44.777+0300"