Windows环境下Fluentd 1.16.3:如何增强指定日志且保留其余日志?
正确的Fluentd配置方案
问题分析
grep过滤器结合@label会将匹配的日志分流到标签路由,导致这些日志无法进入后续默认的dmskrnl.raw匹配规则,若后续有多个输出目标会出现日志拆分问题。parser过滤器中设置tag dmskrnl.enriched会修改日志标签,增加了不必要的复杂度,且容易导致日志丢失。- 冗余的
record_transformer配置完全多余——parser已经将returned_bytes字段解析到日志记录中。
解决方案
我们可以用单一过滤器链处理所有日志,无需路由分流,确保匹配的日志添加字段,不匹配的日志原样保留:
<source> @type tail path C:\dmskrnl.log pos_file C:\dmskrnl.log.pos tag dmskrnl.raw <parse> @type none </parse> </source> <filter dmskrnl.raw> @type parser key_name message reserve_data true ignore_missing true # *关键*:不匹配的日志直接跳过解析,原样保留 <parse> @type regexp expression /myapp\.database - Statement returned (?<returned_bytes>\d+) bytes/ </parse> </filter> <match dmskrnl.raw> @type stdout # 这里可以添加其他输出目标,比如elasticsearch等 </match>
配置说明
ignore_missing true:当message字段不匹配正则表达式时,过滤器不会修改日志记录,直接放行,完美保留非目标日志。reserve_data true:确保解析后原始的message字段和其他原有字段不会被删除。- 无需额外的
grep或record_transformer:parser过滤器已经完成了字段提取的核心工作,且不会过滤任何日志。
备选方案(用record_transformer实现)
如果偏好使用record_transformer,可以通过条件判断实现相同效果:
<source> @type tail path C:\dmskrnl.log pos_file C:\dmskrnl.log.pos tag dmskrnl.raw <parse> @type none </parse> </source> <filter dmskrnl.raw> @type record_transformer enable_ruby true <record> returned_bytes ${ record["message"].match(/myapp\.database - Statement returned (\d+) bytes/)[1] rescue nil } </record> </filter> <match dmskrnl.raw> @type stdout </match>
- 这里用Ruby的
rescue nil确保不匹配的日志不会报错,returned_bytes字段会设为nil(若不需要该字段出现在非目标日志中,可以调整逻辑跳过字段添加)。
内容的提问来源于stack exchange,提问作者kamokoba
相关产品推荐
相关产品推荐

