无痛脚本Kibana 6.4.2未使用matcher匹配,但使用条件表达式匹配

无痛脚本Kibana 6.4.2未使用matcher匹配,但使用条件表达式匹配,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,您好,我正在尝试在kibana脚本字段中使用正则表达式获取日志消息的子字符串。我遇到了一个有趣的场景,这个场景不符合逻辑。我将消息字段转换为关键字,以便对其执行脚本字段操作 当我与条件匹配时,例如: if (doc['message'].value =~ /(\b(?:\d{1,3}\.){3}\d{1,3}\b)/) { return "match" } else { return "no match" } 这将匹配ip并正确返回消息中有ip。但是,每当我尝试使用matcher函数将匹配的

您好,我正在尝试在kibana脚本字段中使用正则表达式获取日志消息的子字符串。我遇到了一个有趣的场景,这个场景不符合逻辑。我将消息字段转换为关键字,以便对其执行脚本字段操作

当我与条件匹配时,例如:

if (doc['message'].value =~ /(\b(?:\d{1,3}\.){3}\d{1,3}\b)/) { 
return "match"
} else {
return "no match"
}
这将匹配ip并正确返回消息中有ip。但是,每当我尝试使用matcher函数将匹配的文本拆分为子字符串时,它都找不到任何匹配项

请遵循此处提供的有关Elastic文档的指南:

这是他们给出的用于匹配日志消息中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条件中时,我尝试使用subs字符串,但是日志消息之间有很多变化。如果我只对脚本字段使用条件,我也看不到一种方法来拆分和查看输出列表,以选择具有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"}

当我在测试窗口中运行它时,它在结果中匹配,但实际的ip字段只有前两个八位字节。设置字符串类型将其绑定,并且它可以工作。这将剥离ip。