从ElasticSearch中的文本中提取数字

时间:2017-04-10 08:48:29

标签: elasticsearch indexing logstash kibana analyzer

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

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

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

"处理53条记录"

"处理45条记录"

"处理97条记录"

我想创建一个名为 processed_records 的字段,分别获取值53,55,97,然后我想创建另一个名为 processed_records_sum 的字段,其中包含摘要每分钟 processed_records

我是ELK的新手,所以我不知道如果我需要在logstash配置文件和/或Kibana中进行更改

3 个答案:

答案 0 :(得分:1)

要提取记录数,需要将日志文件与Grok解析器进行匹配,例如:

%{WORD} %{NUMBER:processed_records} %{WORD}

由于您的日志文件可能比此更复杂,因此可以使用在线工具:

解析完日志文件后,记录计数将存储在Elasticsearch的 processed_records 字段中。

求和( processed_records_sum )需要在查询时完成数据 - 在将日志记录插入Elasticsearch时无法计算总和。

在查询时求和时,要么使用Kibana UI,要么编写Elasticsearch DSL,然后使用聚合。

答案 1 :(得分:0)

虽然不具备性能,但如果必须避免重新索引,您可以在kibana中使用脚本字段。

此处简介:https://www.elastic.co/blog/using-painless-kibana-scripted-fields

  • 通过将以下内容放在elasticsearch.yaml中来启用无痛正则表达式支持:
      

    script.painless.regex.enabled:true

  • 重新启动elasticsearch
  • 通过管理在Kibana中创建一个新的脚本字段 - >索引模式 - >脚本字段
  • 选择无痛作为语言和数字作为类型
  • 创建实际脚本,例如:
def logMsg = params['_source']['log_message'];
if(logMsg == null) {
 return -10000;
}
def m = /.*Processing ([0-9]+) records.*$/.matcher(params['_source']['log_message']);
if ( m.matches() ) {
   return Integer.parseInt(m.group(1))
} else {
   return -10000
}
  • 您必须完全重新加载网站才能执行新字段,只需在开放发现网站上重新搜索就不会获取新字段。 (这几乎让我放弃了试图让这个工作 - .-)
  • 在发现或可视化中使用脚本

虽然我理解,对于数百万个日志条目的脚本字段不具备效果,但我的用例是一个非常具体的日志条目,每天记录10次,我只使用结果字段创建一个可视化或分析,我提前通过常规查询减少候选人。

如果有可能只在需要它们的情况下计算这些字段(或者它们有意义并且可以计算开始;即使“返回-1000”不必要),那将是有意义的。目前,它们将被应用并显示每个日志条目 你可以在这样的查询中生成脚本化的字段:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-script-fields.html但这似乎有点过于掩盖,以便轻松维护:/

答案 2 :(得分:0)

您还可以使用Dissect插件来实现相同功能;

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

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