Fluentd regexp parser过滤器解析日志时丢失原有字段的解决方法
问题原因
Fluentd 的 parser 过滤器默认行为是用解析得到的字段集完全替换原日志事件的全部内容,这就是原有日志携带的容器元数据、采集时间、流类型等前置字段全部丢失的原因。
修复配置
在过滤器配置块中添加 reserve_data true 参数,即可保留原事件的所有已有字段,仅将正则解析出的新字段追加到日志结构中。
针对你的场景,还可以根据需求选择是否保留原事件时间戳、是否删除原始待解析的log字段,修正后的完整配置如下:
# Parse app_logs <filter filter.app.backend.app_logs> @type parser key_name log reserve_data true # 核心配置:保留原有所有字段 reserve_time true # 可选配置:保留原事件自带的time字段,不被日志内解析出的时间覆盖 remove_key_name_field true # 可选配置:解析完成后删除原始log字段,避免冗余 <parse> @type regexp expression /^(?<module>[^ ]*) *(?<time>[\d ,-:]*) (?<severity>[^ ]*) *(?<file>[\w\.]*):(?<function>[\w_]*) (?<message>.*)$/ time_format %Y-%m-%d %H:%M:%S,%L </parse> </filter>
参数说明
reserve_data:设为true时不会清空原日志字段,解析结果会以追加形式合并到原日志结构中,是解决字段丢失问题的核心参数,默认值为false。reserve_time:设为true时会保留日志事件原有的时间戳,不会被parse块中从日志内容解析出的时间覆盖,适合需要保留上游Fluent Bit采集时间的场景。remove_key_name_field:设为true时,解析完成后会自动删除你指定的key_name对应的原始字段(也就是这里的log字段),如果后续不需要使用未解析的原始日志行可以开启,减少存储冗余。- 字段冲突提示:如果没有开启
reserve_time,你当前正则提取的time字段会和原日志自带的time字段重名,最终会以日志内容里解析出的时间为准覆盖原值。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

