从日志消息中提取子字符串 (GROK)

Extract substring from a log message (GROK)

我是 ELK 的新手,我有这条日志消息:

[2020-07-14 13:46:40.812],[DEBUG],[PerformanceLogger],[10.11.12.13],[http-nio-8086-exec-1],[3808B7],1,[2ddf8d01-4e5b-42cf-a6d9-ac2c0a24ccf5],[],[],[],[],[],REQUEST_END,125

我想提取数字 125 - 这个数字出现 只有 如果在它之前有这个确切的字符串:

'REQUEST_END,'

(我想称这个字段为:duration)

这是我目前所做的...但它不起作用:

filter {
  grok {
    match => { 
      "message" => "^\[%{TIMESTAMP_ISO8601:alis_timestamp}\],\[%{LOGLEVEL:alis_loglevel}\s*\],\[%{DATA:alis_class}?\],\[%{IPV4:alis_clientIp}?\],\[%{DATA:alis_threadid}?\],\[%{DATA:alis_sessionid}?\],%{INT:alis_companyid}?,\[%{DATA:alis_requesttoken}?\],\[%{DATA:alis_activity}?\],\[%{DATA:alis_screen}?\],\[%{INT:alis_action}?\],\[%{INT:alis_region}?\],\[%{DATA:alis_nextscreen}?\],%{GREEDYDATA:logMessage}?" 
      "logMessage" =>["REQUEST_END, %{WORD:duration}"]
    }
  }
 

}

如何提取这个号码?

您的代码看起来非常接近解决方案。 我想“logMessage”grok 行中只有一个拼写错误。 替换此行:

  "logMessage" =>["REQUEST_END, %{WORD:duration}"]

通过这个:

  "logMessage" =>["REQUEST_END,%{INT:duration}"]

WORD 模式无法捕获整数“字符串”,使用 INT grok 的模式你必须捕获你的 duration 字段,还有一个 space 不在此处。

并且您必须设置 2 个不同的 grok 过滤器才能解析 2 个步骤,因此您的过滤器部分在您的 logstash 配置文件中:

  filter{
    grok {
        match => { 
          "message" => "^\[%{TIMESTAMP_ISO8601:alis_timestamp}\],\[%{LOGLEVEL:alis_loglevel}\s*\],\[%{DATA:alis_class}?\],\[%{IPV4:alis_clientIp}?\],\[%{DATA:alis_threadid}?\],\[%{DATA:alis_sessionid}?\],%{INT:alis_companyid}?,\[%{DATA:alis_requesttoken}?\],\[%{DATA:alis_activity}?\],\[%{DATA:alis_screen}?\],\[%{INT:alis_action}?\],\[%{INT:alis_region}?\],\[%{DATA:alis_nextscreen}?\],%{GREEDYDATA:logMessage}?" 
          }
    }
    grok {
        match => {   
          "logMessage" =>["REQUEST_END,%{INT:duration}"]
        }
      }
  }