如何用正则捕获组匹配多输入?适配Logstash Grok场景
Logstash Grok多Agent数据捕获解决方案
针对多Agent场景下捕获组被覆盖的问题,核心解决思路是让正则重复匹配所有Agent块,利用Logstash自动将重复捕获字段转为数组的特性,完整保留所有Agent数据。
适配多Agent的Grok正则
直接替换原有正则,以下表达式完全兼容单/多Agent场景:
cs1=(?:(?<agent_name>[a-zA-Z0-9\.\-]+)\s\(ip:\s(?<agent_ip>[0-9.]+), component_id:\s(?<component_id>[a-zA-Z0-9\-\.]+)\)(?:, )?)+
正则拆解
(?: ... )+:非捕获重复组,匹配1个或多个Agent块,确保所有Agent都被处理(?<agent_name>[a-zA-Z0-9\.\-]+):匹配Agent域名(如123.abc.com),多次捕获后自动转为数组\s\(ip:\s(?<agent_ip>[0-9.]+):匹配Agent的IP地址,和原正则规则一致component_id:\s(?<component_id>[a-zA-Z0-9\-\.]+):匹配component_id值(?:, )?:匹配Agent之间的分隔符,,最后一个Agent后无分隔符时也能正常匹配
效果验证
单Agent场景输入
cs1=123.abc.com (ip: 10.1.1.1, component_id: x)
捕获后字段(自动转为单元素数组):
agent_name: ["123.abc.com"]agent_ip: ["10.1.1.1"]component_id: ["x"]
多Agent场景输入
cs1=123.abc.com (ip: 10.1.1.2, component_id: x), 456.abc.com (ip: 10.1.1.3, component_id: y)
捕获后字段(多元素数组):
agent_name: ["123.abc.com", "456.abc.com"]agent_ip: ["10.1.1.2", "10.1.1.3"]component_id: ["x", "y"]
可选优化
如果需要保留原始cs1字段的完整内容,可在正则开头增加捕获:
cs1=(?<cs1>.+?)(?:(?<agent_name>[a-zA-Z0-9\.\-]+)\s\(ip:\s(?<agent_ip>[0-9.]+), component_id:\s(?<component_id>[a-zA-Z0-9\-\.]+)\)(?:, )?)+
注:.*?为非贪婪匹配,避免覆盖后续Agent的捕获逻辑。
内容的提问来源于stack exchange,提问作者Teezuz
相关产品推荐
相关产品推荐

