如何自定义GROK规则提取日志中的纯消息内容?
提取日志纯消息部分的Logstash Grok配置方案
日志格式示例
30-10-22 20:35:36 [DEBUG] [Default] [Worker] Sleeping for 10 seconds...
需求
仅提取日志末尾的纯消息内容:Sleeping for 10 seconds...,替换原message字段或生成新字段存储该内容。
原配置问题
原配置中使用%{GREEDYDATA:message_pvt}会匹配整个日志内容,因为它默认从日志开头匹配到结尾,没有排除时间、日志级别等前缀部分。
解决方案
自定义Grok规则
针对该日志格式,编写Grok模式跳过所有前缀内容,仅提取最后部分的纯消息:
# 若需要保留前缀字段(如日志级别),可命名字段 %{DATE} %{TIME}\s+\[%{LOGLEVEL:log-level_pvt}\]\s+\[%{DATA}\]\s+\[%{DATA}\]\s+%{GREEDYDATA:message} # 若不需要前缀字段,可简化为 %{DATE} %{TIME}\s+\[%{LOGLEVEL}\]\s+\[%{DATA}\]\s+\[%{DATA}\]\s+%{GREEDYDATA:message}
其中:
\s+匹配任意数量的空白字符(适配日志中多个空格的分隔)- 前面的模式用于匹配并跳过时间、日志级别、模块、组件等前缀内容
%{GREEDYDATA:message}提取剩余的纯消息部分
修改后的Filter配置
方案1:覆盖原message字段
filter { grok { match => { "message" => "%{DATE} %{TIME}\s+\[%{LOGLEVEL:log-level_pvt}\]\s+\[%{DATA}\]\s+\[%{DATA}\]\s+%{GREEDYDATA:message}" } overwrite => ["message"] # 用纯消息覆盖原完整日志内容 } }
方案2:生成新字段存储纯消息
如果不想覆盖原message字段,可将纯消息存入message_pvt:
filter { grok { match => { "message" => "%{DATE} %{TIME}\s+\[%{LOGLEVEL:log-level_pvt}\]\s+\[%{DATA}\]\s+\[%{DATA}\]\s+%{GREEDYDATA:message_pvt}" } } }
内容的提问来源于stack exchange,提问作者yunisdov
相关产品推荐
相关产品推荐

