elasticsearch - Painless Scripting Kibana 6.4.2 不使用匹配器匹配,但使用条件表达式匹配
问题描述
您好,我正在尝试在 kibana 脚本字段中使用正则表达式获取日志消息的子字符串。我遇到了一个有趣的场景,但没有加起来。我将消息字段转换为关键字,以便可以对其进行脚本字段操作。
当我匹配一个条件时,例如:
if (doc['message'].value =~ /(\b(?:\d{1,3}\.){3}\d{1,3}\b)/) {
return "match"
} else {
return "no match"
}
这将匹配 ip 并正确返回消息中有 ip。但是,每当我尝试执行将匹配的文本拆分为子字符串的匹配器函数时,它都找不到任何匹配项。
按照此处的 Elastic 文档指南进行操作: https ://www.elastic.co/blog/using-painless-kibana-scripted-fields
这是他们提供的示例脚本,用于匹配日志消息中 ip 的第一个八位字节。但是,当日志消息中确实存在 ip 地址时,这将不返回任何匹配项。无论我做什么,我什至不能只匹配文本字符,它返回 0 个匹配项。
我也在集群中的 elasticsearch.yml 中启用了 rexex。
def m = /^([0-9]+)\..*$/.matcher(doc['message'].value);
if ( m.matches() ) {
return Integer.parseInt(m.group(1))
} else {
return m.matches() + " - " + doc['message'].value;
}
这将返回 0 个匹配项。即使我使用与条件相同的表达式:
/(\b(?:\d{1,3}.){3}\d{1,3}\b)/
匹配器仍将返回 false。
根据应该有效的文档,任何想法我在这里做错了什么。
当 if 条件中存在该值时,我尝试使用子字符串,但日志消息之间存在许多差异。如果我只是对脚本字段使用条件,我也看不到一种方法来拆分和查看输出列表以选择带有 ip 的输出。
关于如何解决这个问题的任何想法:
这是返回表单的示例
def m = /^([0-9]+)\..*$/.matcher(doc['message'].value);
if ( m.matches() ) {
return Integer.parseInt(m.group(1))
} else {
return m.matches() + " - " + doc['message'].value;
}
有趣的是它们都返回 false ,这实际上只是在寻找带有 . 而且我尝试了各种正则表达式组合,但都没有运气。
[
{
"_id": "VRYK_2kB0_nHZ_3qyRwt",
"Source-IP": [
"false - #Version: 1.0"
]
},
{
"_id": "VhYK_2kB0_nHZ_3qyRwt",
"Source-IP": [
"false - 2019-02-17 00:34:11 127.0.0.1 GET /status/web - 8611 - 127.0.0.1 ELB-HealthChecker/2.0 - 200 0 0 31"
]
},
{
"_id": "VxYK_2kB0_nHZ_3qyRwt",
"Source-IP": [
"false - #Software: Microsoft Internet Information Services 10.0"
]
},
{
"_id": "WBYK_2kB0_nHZ_3qyRwt",
"Source-IP": [
"false - #Date: 2019-03-26 00:00:08"
]
},
{
"_id": "WRYK_2kB0_nHZ_3qyRwt",
"Source-IP": [
127.0.0.1 ELB-HealthChecker/2.0 - 200 0 0 15"
]
},
{
解决方案
最终成为以下内容:
if (doc["message"].value != null) {
def m = /(\b(?:\d{1,3}\.){3}\d{1,3}\b)/.matcher(doc["message"].value);
if (m.find()) { return m.group(1) }
else { return "no match" }
}
else { return "NULL"}
推荐阅读
- keras - Keras 预测类标注
- doctrine-orm - 获取下一个学说迁移的名称
- reactjs - 整个页面在导航时加载
- java - Java android 房间获取HashMap grom db
- python - 从框架继承的类中对象的实例属性,如何检查小部件的类型
- c# - 如何使用重复值更新元素值?
- javascript - 如何去抖动 Formik Field ReactJS
- python - 没有梯度依赖的张量到 numpy 的转换
- node.js - 如何查询 mongoDB 以获取 _id 值与数组中的一个 _id 值匹配的文档?
- python - opencv ximgproc.slic 和 skimage segmentation.slic 有什么区别?