使用Grok处理器提取含嵌套结构的JS对象问题
解决Stripe错误日志JS对象的Grok提取问题
问题说明
要从Stripe错误日志里,用Grok处理器把无引号键、含单引号的JS对象提取到stripeError字段,但三次尝试都没达标:
- 第一次用JSON解析规则,因为JS对象键没加引号、用单引号包裹字符串,直接解析失败;
- 第二次用keyvalue模式,搞不定嵌套JS对象,还把部分键转成了数组;
- 第三次专门针对嵌套结构写规则,虽然提取出内容,但生成了数组,还漏掉了
myCustomKeyToTest字段。
可行解决方案
方法一:转合法JSON后解析(推荐)
Grok处理不规则JS对象容易踩坑,先把JS对象转成标准JSON再解析,更稳定:
- 先用Grok把整个JS对象内容提取到临时字段:
stripeError: %{DATA:stripeError_raw} - 用
mutate插件替换字符,把JS对象转成合法JSON:mutate { gsub => [ # 给无引号的JS键加上双引号 "stripeError_raw", "([a-zA-Z_][a-zA-Z0-9_]*):", '"\1":', # 把单引号换成双引号 "stripeError_raw", "'", '"' ] } - 最后用
json插件解析到stripeError字段:json { source => "stripeError_raw" target => "stripeError" }
方法二:纯Grok模式(适配特定结构)
如果必须用纯Grok,针对你的日志结构编写精准规则(注意:字段顺序或结构变化时会失效):
假设日志里的JS对象格式为:
stripeError: {id: 'err_123', message: 'Payment failed', metadata: {user_id: 456, myCustomKeyToTest: 'test_val'}, code: 'card_declined'}
对应的Grok规则:
stripeError: {id:%{SPACE}'%{DATA:stripeError.id}'%{DATA},message:%{SPACE}'%{DATA:stripeError.message}'%{DATA},metadata:%{SPACE}{user_id:%{SPACE}%{NUMBER:stripeError.metadata.user_id},%{SPACE}myCustomKeyToTest:%{SPACE}'%{DATA:stripeError.metadata.myCustomKeyToTest}'}%{DATA},code:%{SPACE}'%{DATA:stripeError.code}'}
这个规则会精准匹配每个字段,包括嵌套的myCustomKeyToTest,避免生成数组。
内容的提问来源于stack exchange,提问作者Noitidart
相关产品推荐
相关产品推荐

