如何调整Logstash自定义Grok模式以提取日志中HARS-X6790字段
问题根因
原Grok规则存在两个核心问题导致匹配错位:
- 漏匹配了行号与时间戳之间的
HARS-X6790设备标识字段,匹配位整体偏移 - 字段间仅写死单个空格作为分隔符,和日志里实际存在的连续多空格分隔格式不兼容,直接导致
NUMBER模式错误抓取到设备标识里的数字片段6790,时间戳匹配完全失效。
修正后的Grok规则
%{NUMBER:ligne}\s+%{NOTSPACE:device_id}\s+%{TIMESTAMP_ISO8601:syslog_timestamp}\s+%{GREEDYDATA:syslog_message}
规则说明
- 新增
device_id匹配位,使用%{NOTSPACE}模式捕获连续非空格的设备标识字段,补全原规则缺失的匹配段,从根源解决字段偏移问题 - 所有字段分隔位置使用
\s+匹配1个及以上任意空白字符,兼容日志中存在的多空格、制表符等空白分隔场景,不要写死固定数量的空格作为日志字段分隔符,避免因为空格数量差异出现匹配错位 - 匹配成功后各字段取值完全符合预期:
ligne:提取日志开头的行号值2589522device_id:提取设备标识HARS-X6790syslog_timestamp:正确捕获时间值2022-08-05 08:55:15syslog_message:捕获剩余全部日志内容--EX: SCR45778554 ID '346402454540629'
如果需要进一步拆分日志消息里的SCR单号、单引号包裹的ID值,可以在现有规则基础上,把末尾的%{GREEDYDATA:syslog_message}替换为更细粒度的匹配模式即可。
内容的提问来源于stack exchange,提问作者yasser elalami
相关产品推荐
相关产品推荐

