在ECS Fargate环境下使用Fluentd如何修改source字段取值?
问题根因
你之前配置不生效的核心原因有两个:
- 过滤器执行顺序早于
source字段的注入时机:如果使用AWS FireLens做Fargate日志采集,source、容器名称这类元数据字段是在自定义过滤器执行完成后才被系统追加的,你修改时字段还不存在,后续系统写入的默认值直接覆盖了你之前的修改 - 插件默认未开启字段覆写权限:部分版本的
record_transformer、record_modifier默认不会强制覆写已存在的同名字段,需要显式开启对应配置
可行实现方案
方案1:调整执行顺序+record_transformer强制覆写
将过滤器配置放在所有元数据注入逻辑之后,显式开启Ruby支持和字段覆写:
<filter foo.**> @type record_transformer enable_ruby true # 开启强制覆写已有字段 renew_record false <record> source ${ "foo-" + Socket.gethostname } </record> </filter>
方案2:使用record_modifier直接赋值
比正则替换规则更简单,直接强制覆盖指定字段:
<filter foo.**> @type record_modifier # 开启字段覆写权限 replace_node yes <record> source "foo-#{Socket.gethostname}" </record> </filter>
方案3:调用Fargate元数据接口生成唯一标识(适合多实例区分场景)
如果需要每个Fargate实例的source值唯一,可以通过Fargate内置的元数据端点获取任务ARN拼接自定义名称,不需要依赖hostname:
<filter foo.**> @type record_transformer enable_ruby true <record> source ${ require 'net/http' require 'json' uri = URI(ENV['ECS_CONTAINER_METADATA_URI_V4'] + '/task') task_meta = JSON.parse(Net::HTTP.get(uri)) task_suffix = task_meta['TaskARN'].split('/').last "foo-#{task_suffix}" } </record> </filter>
生效校验方法
临时添加stdout输出插件,查看控制台输出的日志字段是否符合预期,确认无误后换回原有输出插件即可:
<match foo.**> @type stdout </match>
内容的提问来源于stack exchange,提问作者SnazzyBootMan
相关产品推荐
相关产品推荐

