我使用logstash将日志发送到ElasticSearch 5.1实例并使用Kibana 5.1显示所有结果。
如何仅从日志的已知模式字符串中提取数字,然后汇总每分钟的所有数字?
例如,我的日志行包含以下文本:
"处理53条记录"
"处理45条记录"
"处理97条记录"
我想创建一个名为 processed_records 的字段,分别获取值53,55,97,然后我想创建另一个名为 processed_records_sum 的字段,其中包含摘要每分钟 processed_records 。
我是ELK的新手,所以我不知道如果我需要在logstash配置文件和/或Kibana中进行更改
答案 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
script.painless.regex.enabled:true
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中相应地配置了摘要!