首页 > 解决方案 > 如何使用 grok 模式在 logstash 中解析半径 CDR

问题描述

有什么方法可以使用 grok 模式字段从以下消息事件中获取字段,我必须在下面解析并存储在弹性中,如下所示

时间戳 => NET-Log-Time

device_ip => NAS-IP-地址

消息 => 消息

Message => 
" Tue Nov 22 15:20:33 2011
    NET-Log-Time = "Tue Nov 22 15:20:31 2011\n"
    Acct-Status-Type = Start
    NET-Session-Ingress-CallId = 0
    NET-Session-Egress-CallId = 65535
    NET-Session-Generic-Id = 14
    Acct-Multi-Session-Id = "132200403114"
    NET-Ingress-Signaling-Group = 19992
    NET-Egress-Signaling-Group = 0
    NET-Ingress-Channel-Number = 23
    NET-Egress-Channel-Number = 0
    NET-Call-Origin = 1
    NET-Calling-Number = "1029"
    NET-Called-Number = "2006"
    NET-Calling-Name = "System Test"
    NET-Ingress-Channel-Id = "1:1:23"
    NET-Setup-Time = "1322004031"
    Acct-Session-Id = "0"
    NET-Firmware-Version = "2.0.0v107"
    NET-Local-Time-Zone = "PST8PDT"
    NET-Gw-Id = "f5a4fdc8f970ae35addf36"
    NET-Time-And-Day = "1322004031"
    NAS-Port = 1813
    Acct-Delay-Time = 0
    NAS-IP-Address = 134.56.227.230
    Acct-Unique-Session-Id = "df05da217dbe16e4"
    Timestamp = 1322004033
    Request-Authenticator = Verified"

使用 %{GREEDYDATA:messageBody} 我可以提取

{
  "messageBody": "Mon Jun 14 18:08:54 2021"
}

标签: logstashlogstash-grokgrok

解决方案


我也在做半径。我必须先合并所有这些行,您可以multiline在输入编解码器/logstash 过滤器(终止)上执行此操作。多行编解码器

这对你来说是完美的例子

    input {
      stdin {
        codec => multiline {
          pattern => "^\s"
          what => "previous"
        }
      }
    }

pattern => "^\s" 这匹配每一行的开始空间

what => "previous" 这是动作,如果行匹配模式你会做什么。在此示例中将附加到上一行。

对于您的日志示例,我认为这种模式是^\s{2,}因为您只想合并那些开始有 2 个或更多空间的人。

附加到另一条消息的那些有分隔符\n


推荐阅读