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"
。
我们有一个 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"
。