Splunk正则解析日志时如何跳过转义字符正确捕获Message等字段
问题解决方案
方案1:优先使用Splunk内置JSON解析(更稳定,无需复杂正则)
你当前的整条日志本身就是标准JSON结构,完全可以先提取line字段的完整值,再对line做分隔提取,步骤更简单也不容易出错:
- 第一步用
spath命令提取line字段:| spath output=line_content path=line - 第二步对line_content按
|分割提取四个字段:
| rex field=line_content "^(?<time>[^|]+)\|(?<log_level>[^|]+)\|(?<Controller>[^|]+)\|(?<Message>.+)$"
这个方案不受外层JSON其他字段的干扰,即使后续日志外层加了其他字段也能正常工作。
方案2:直接对整条日志写正则提取
如果你需要直接从原始日志字符串一步提取四个字段,可以用边界限定规则避免越界匹配,正则如下:
\{"line":"(?<time>[^|]+)\|(?<log_level>[^|]+)\|(?<Controller>[^|]+)\|(?<Message>.+?)","source"
正则逻辑说明:
[^|]+匹配除了|之外的所有字符,确保time、log_level、Controller三个字段不会超出自己的分隔边界.+?非贪婪匹配所有字符,结合后面的","source固定边界,会让Message在到达line字段的结束位置时立刻停止,不管Message内部包含引号、花括号等任何特殊字符都不会影响匹配- 你给出的四条测试日志都可以用这个正则正常提取所有目标字段
内容的提问来源于stack exchange,提问作者97WaterPolo
相关产品推荐
相关产品推荐

