Fluentd配置文件,在<source />中获取文件名并将其作为标记传递给<match>

时间:2017-07-28 01:54:37

标签: config fluentd

我正在尝试为fluentd + fluentd-s3-plugin编写一个干净的配置文件,并将其用于许多文件。

我想避免为每个文件复制和粘贴每个<source>和每个<match>,所以我想让它变得有点动态。我到现在所拥有的:

  <source>
    @type tail
    path /var/www/blabla/blabla/log/production.log
    pos_file /var/www/blabla/blabla/log/production.log.pos
    tag production-log
    format /(?<time>.*)/
  </source>


  <match production-log>
    @type s3

      s3_bucket xxxx
      s3_region xxxx

      path "staging/%Y/%m/%d/#{Socket.gethostname}/"
      s3_object_key_format "%{path}productionlog-%{time_slice}-#{Socket.gethostname}-%{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
        tag ${tag}
        path /var/www/blabla/blabla/log/buffer/
        timekey 3600 # (default 3600) 1 hour partition
        timekey_wait 1m
        timekey_use_utc true # use utc

      </buffer>
      <format>
        @type json
      </format>
  </match>

如您所见,我多次使用生产日志,所以我的问题是2:

如何使用tag中的文件名?

如何在s3_object_key_format中使用此传递的代码? (我知道有说明评论,但我不明白)

1 个答案:

答案 0 :(得分:3)

您能够解决上述问题吗?您确实需要将标记字段传递给缓冲区,而无需使用缓冲区内部。

这是我的有效配置。希望这会有所帮助,如果尚未解决。我的不同来源为标签字段发送了不同的值,在S3下,我按标签字段创建了单独的文件夹并将对象放置在它们下面。

所以会像(app1和app2是标签)

mybucket-> topPrefix-> app1-> app.log

mybucket-> topPrefix-> app2-> app.log

<match>
  @type s3

  s3_bucket "mybucket"
  path "topPrefix/${tag}"
  s3_object_key_format "%{path}/%{time_slice}_#{Socket.gethostname}_%{index}.%{file_extension}"
  include_time_key true
  time_format "%Y-%m-%dT%H:%M:%S.%L"

  <buffer tag,time>
    @type file
    path /fluentd/buffer/s3
    timekey_wait 1m
    timekey 1m
    chunk_limit_size 64m
  </buffer>
  <format>
    @type json
  </format>
  time_slice_format %Y%m%d%H%M
</match>