如何在Grafana中用Lucene Query去除Elasticsearch字段前缀子串
解决Grafana中Elasticsearch日志字段的前缀截取问题
我之前处理过类似的日志提取需求,结合你在用的Grafana v5.0.4和Elasticsearch 5.x版本,咱们可以通过在查询中使用脚本字段来精准提取你需要的内容,具体操作如下:
核心思路
你的日志前缀有固定模式(都是以<30>日期时间 workers foo :或workers foo:这类格式结尾的前缀),我们可以用正则匹配定位前缀的结束位置,提取之后的目标内容,再基于提取后的内容做分组统计。
具体操作步骤
- 打开Grafana的Elasticsearch查询配置面板,找到Group by区域:
- 把原来选择
message.keyword作为分组字段的设置,改成选择Script选项(而非具体字段)。
- 把原来选择
- 在脚本输入框中,填入以下Painless脚本(Elasticsearch 5.x原生支持Painless语法):
这个脚本的作用是:用正则匹配整个日志内容,找到def matcher = /^.*?foo\s*:\s*(.*)$/.matcher(doc['message.keyword'].value); if (matcher.find()) { return matcher.group(1); } else { return doc['message.keyword'].value; // 防止匹配失败时丢失数据,返回原内容 }foo后跟随冒号(允许冒号前后有空格)的位置,提取冒号之后的所有内容作为分组依据。 - 保持指标为
Count、时间分组@timestamp的设置不变,执行查询后就能得到你期望的去掉前缀的结果了。
灵活调整提示
如果后续日志前缀模式有变化,只需要修改正则表达式即可。比如如果前缀固定结尾是workers foo,可以把正则改成^.*?workers foo\s*:\s*(.*)$,匹配会更精准。
内容的提问来源于stack exchange,提问作者Denis Arkhipof
相关产品推荐
相关产品推荐

