elasticsearch 从ElasticSearch中的文本中提取数字,elasticsearch,indexing,logstash,kibana,analyzer,elasticsearch,Indexing,Logstash,Kibana,Analyzer" /> elasticsearch 从ElasticSearch中的文本中提取数字,elasticsearch,indexing,logstash,kibana,analyzer,elasticsearch,Indexing,Logstash,Kibana,Analyzer" />

elasticsearch 从ElasticSearch中的文本中提取数字

elasticsearch 从ElasticSearch中的文本中提取数字,elasticsearch,indexing,logstash,kibana,analyzer,elasticsearch,Indexing,Logstash,Kibana,Analyzer,我使用logstash将日志发送到ElasticSearch 5.1实例,并使用Kibana 5.1显示所有结果 如何仅从日志的已知模式字符串中提取数字,然后汇总每分钟的所有数字 例如,我的日志行包含以下文本: “处理53条记录” “处理45条记录” “处理97条记录” 我想创建一个名为已处理的_记录的字段,分别获取值53、45和97,然后我想创建另一个名为已处理的_记录的字段,其中包含每分钟已处理的_记录的摘要 我是ELK新手,所以我不知道是否需要更改logstash conf文件和/或Kib

我使用logstash将日志发送到ElasticSearch 5.1实例,并使用Kibana 5.1显示所有结果

如何仅从日志的已知模式字符串中提取数字,然后汇总每分钟的所有数字

例如,我的日志行包含以下文本:

“处理53条记录”

“处理45条记录”

“处理97条记录”

我想创建一个名为已处理的_记录的字段,分别获取值53、45和97,然后我想创建另一个名为已处理的_记录的字段,其中包含每分钟已处理的_记录的摘要


我是ELK新手,所以我不知道是否需要更改logstash conf文件和/或Kibana来提取记录数,日志文件需要与Grok解析器匹配,例如:

%{WORD} %{NUMBER:processed_records} %{WORD}
由于您的日志文件可能比这更复杂,因此有在线工具可提供帮助:

  • 要获取Grok模式的列表,请参阅
  • 要构造新的Grok语句,请参见
  • 测试Grok语句或
解析日志文件后,记录计数将存储在Elasticsearch中的已处理的\u记录字段中

求和(已处理的\u记录\u求和)数据需要在查询时完成-将日志记录插入Elasticsearch时,无法计算求和


在查询时求和时,可以使用Kibana UI,或者如果编写Elasticsearch DSL,则使用聚合。

在没有执行的情况下,如果必须避免重新索引,则可以在Kibana中使用脚本字段

简介如下:

  • 通过在elasticsearch.yaml中添加以下内容来启用无痛正则表达式支持: script.painless.regex.enabled:true

  • 重新启动elasticsearch
  • 通过管理->索引模式->脚本字段,在Kibana中创建一个新的脚本字段
  • 选择painless作为语言,选择number作为类型
  • 创建实际脚本,例如:
def logMsg=params[''u source']['log\u message']; 如果(logMsg==null){ 返回-10000; } def m=/.*处理([0-9]+)记录。*$/.matcher(参数[''u source']['log\u message']); 如果(m.matches()){ 返回整数.parseInt(m.group(1)) }否则{ 返回-10000 }
  • 要执行新字段,您必须完全重新加载网站,只需在打开的发现网站上重新搜索,将无法获取新字段。(这几乎让我放弃了让它工作的努力——。-)
  • 在发现或可视化中使用脚本
虽然我明白,为数百万个日志条目编写字段是不可行的,但我的用例是一个非常具体的日志条目,每天总共记录10次,我只使用生成的字段来创建可视化或在分析中,通过提前进行常规查询来减少候选项

如果有可能只在您需要这些字段的情况下计算这些字段(或者这些字段有意义&一开始是可计算的;例如,使“return-1000”变得不必要),那将非常有趣。当前,它们将应用于每个日志条目并显示。

您可以在查询内部生成脚本字段,如下所示:但这似乎有点太过隐蔽,难以轻松维护:/

您也可以使用解剖插件来实现同样的功能

dissect { mapping => { "message" => "%{processing} %{processed_records} %{records}" }

然后在Kibana中相应地配置了摘要

您必须编写一个grok筛选器来捕获日志中的记录数。你写过吗?我不知道grok过滤器的事。我很快就会查出来的。谢谢谢谢,这很有帮助!
dissect { mapping => { "message" => "%{processing} %{processed_records} %{records}" }