如何在Fluentd的单个parse段中配置3个正则表达式解析多格式多行日志
Fluentd 单文件多类型日志+多行解析配置方案
Fluentd 内置的 multiline 解析器原生支持在单个 <parse> 配置段内按顺序定义多条正则规则,规则命名为 format1、format2、format3……依次递增即可,解析时会从上到下匹配规则,命中后就会按对应规则提取字段,配合 format_firstline 即可实现多行日志的边界识别。
配置修改说明
- 首先调整
format_firstline的正则,确保能覆盖所有类型日志的首行特征,用来判断新一条日志的起始位置,避免多行内容串到其他日志条目里 - 按你需要的规则顺序添加
formatN条目,匹配优先级更高的日志格式往前放,降低匹配开销 - 最后一条规则设置为通用的多行内容捕获规则,用来匹配日志条目里除首行外的剩余所有内容
完整配置示例
<source> @type tail path /opt/td-agent/dev/events.log pos_file /opt/td-agent/dev/events.log.pos tag events <parse> @type multiline # 适配所有类型日志的首行特征,可根据实际日志格式调整正则 format_firstline /^\d+|^[A-Z]{4}/ # 第一种日志格式(你原有的格式) format1 /^(?<msg_id>\d+) (?<time>\d+\/\d+\/\d+\s+\d{2}:\d{2}:\d{2}\.\d{3}) UTC (?<severity>\S+\b): (?<subject>\S+\b) \#(?<sub_id>\S+) (?<router_name>\b\S+\b) (?<ip_addr>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\n/ # 第二种日志格式,按实际业务需求修改正则 format2 /^(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (?<level>\w+) (?<module>\w+): (?<content>.*)/ # 第三种日志格式,按实际业务需求修改正则 format3 /^\[(?<trace_id>\w+)\] (?<user_id>\d+) (?<req_time>\d+)ms (?<req_path>\/\S*)/ # 通用多行剩余内容捕获,匹配所有剩下的字符(包括换行) format4 /(?<message>(.|\s)*)/ # 公共时间配置,可按需调整 time_key time time_format %Y/%m/%d %H:%M:%S.%L utc true </parse> </source>
注意事项
- 所有正则规则的命名必须从1开始连续递增,不能跳号,跳号后的规则不会生效
- 如果不同日志格式的时间字段名、时间格式不一致,可以单独在对应
formatN规则后加time_key和time_format参数,优先级高于全局配置 - 可以先使用
fluent-cat命令本地测试正则匹配效果,确认无误后再上线
内容的提问来源于stack exchange,提问作者Boucurious
相关产品推荐
相关产品推荐

