Logstash Grok解析失败求助:无法提取content字段
Logstash Grok解析失败问题解决方法
问题背景
Grok规则在调试器中测试原始日志示例正常,但Logstash运行时出现_grokparsefailure标签,无法提取content等自定义字段。
相关信息
- 服务器日志示例:
2023-07-14 16:33:58.464 [traceId:] [http-nio-9013-exec-10] INFO com.tlx.usercenter.socket.service.WebSocketServer - websocket disconnect!
- 使用的Grok配置:
grok { match => { "message" => "(?<logTime>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{3})\s+\[(?<traceId>\S*)\]\s+\[(?<thread>.*)\]\s+(?<level>\w*)\s+(?<class>\S*)\s+\-\s+(?<content>.*)" } }
- Logstash输出日志片段:
{ "tags": [ "multiline", "_grokparsefailure" ], "level": "INFO", "message": "【websocket服务端】连接断开,总数为:1", "thread_name": "http-nio-9013-exec-10", "logger_name": "com.tlx.usercenter.socket.service.WebSocketServer", "@timestamp": 2023-07-14T08:33:58.464Z }
排查关键点
message字段内容不符:调试器使用完整原始日志行,但Logstash输出中的message仅为日志内容部分,说明输入阶段已通过log4j/json等codec将原始日志解析为结构化数据,message不再是整行日志。multiline标签影响:输出带有multiline标签,可能是multiline插件合并日志行导致message为多行内容,与Grok规则匹配的单行格式冲突。- Grok规则细节问题:规则中
\d{2}:\d{2}:\d{2}.\d{3}的.未转义,正则中.匹配任意字符,可能导致匹配异常。
解决步骤
1. 确认输入阶段的日志处理逻辑
- 若使用
log4j/json等codec:这类codec会自动解析日志为结构化字段(如level、thread_name),此时content对应的数据就是当前的message字段。若需保留原始日志行,可在输入阶段添加字段存储原始内容:
input { file { path => "/path/to/your/logs" codec => log4j { add_field => { "raw_message" => "%{message}" } } } }
之后将Grok匹配目标改为raw_message字段。
- 若使用
multiline插件:检查配置是否正确,确保每条日志为独立单行。正确配置示例(以时间戳开头作为新日志起始):
input { file { path => "/path/to/your/logs" codec => multiline { pattern => "^%{YEAR}-%{MONTHNUM}-%{MONTHDAY}" negate => true what => "previous" } } }
2. 修正Grok规则
转义正则中的.,调整后的规则:
grok { match => { "raw_message" => "(?<logTime>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3})\s+\[(?<traceId>\S*)\]\s+\[(?<thread>.*)\]\s+(?<level>\w*)\s+(?<class>\S*)\s+\-\s+(?<content>.*)" } }
3. 验证实际字段内容
在Logstash配置中添加标准输出,确认message或raw_message的实际内容:
output { stdout { codec => rubydebug } }
根据输出的字段内容调整Grok匹配的目标字段和规则,确保与实际输入的日志内容一致。
内容的提问来源于stack exchange,提问作者刘楠庭
相关产品推荐
相关产品推荐

