【问题标题】:logstash parse log fieldlogstash 解析日志字段
【发布时间】:2013-09-17 19:01:24
【问题描述】:

我正在尝试从 Postfix 日志中解析 @message 字段并将其提取到多个字段中。

消息:

<22>Sep 17 19:12:14 postfix/smtp[18852]: 28D40A036B: to=<test@gmail.com>, relay=192.244.100.25[192.244.100.25]:25, delay=0.13, delays=0.01/0.01/0.09/0.02, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 9030A15D0)

LogStash 输出:

{
  "@source": "syslog://192.244.100.42/",
  "@tags": [
    "_grokparsefailure"
  ],
  "@fields": {
    "priority": 13,
    "severity": 5,
    "facility": 1,
    "facility_label": "user-level",
    "severity_label": "Notice"
  },
  "@timestamp": "2013-09-17T17:12:06.958Z",
  "@source_host": "192.244.100.42",
  "@source_path": "/",
  "@message": "<22>Sep 17 19:12:14 postfix/smtp[18852]: 28D40A036B: to=<test@gmail.com>, relay=192.244.100.25[192.244.100.25]:25, delay=0.13, delays=0.01/0.01/0.09/0.02, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 9030A15D0)",
  "@type": "syslog"
}

我尝试使用 grok 解析器,但数据仍保留在 @message 字段中。我想使用带有正则表达式的 syslog 解析器。

我应该遵循哪些步骤来解析@message 字段?

【问题讨论】:

    标签: regex parsing logstash postfix


    【解决方案1】:

    输出中有 _grokparsefailure 的事实表明解析日志时出现问题。您在配置中使用的 grok 过滤器是什么?

    【讨论】:

      【解决方案2】:

      虽然我们现在使用的是 Logstash 5.x,但 grok 的概念保持不变。

      不幸的是,Postfix 在日志记录中有一些非常烦人的模式,因为少数人写了一些patterns,这些数据占了您最终会在 Postfix 日志中看到的大部分数据。我只会使用其中的几个。

      关键是识别消息的组成部分,如果它们符合标准或非常流行,很可能已经为它编写了一个 grok 过滤器(例如 syslog)。你不知道的消息的组成部分,你可以用 grok 写一个过滤器。

      让我们把消息分成几部分:

      • &lt;22&gt;Sep 17 19:12:14 postfix/smtp[18852]::这非常接近 RFC5424 系统日志,但缺少 ver (version) 字段。

        • SYSLOG5424PRI:优先级值
        • SYSLOGTIMESTAMP:不言自明
        • SYSLOGPROG:应用程序的名称
      • 28D40A036B: to=&lt;test@gmail.com&gt;, relay=192.244.100.25[192.244.100.25]:25, delay=0.13, delays=0.01/0.01/0.09/0.02, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 9030A15D0):这是 Postfix 的域特定信息。

        • POSTFIX_KEYVALUE_DATA:用作另一个过滤器的组件以匹配 key=value 数据(例如 relay=...、delay=...)。
        • POSTFIX_QUEUEID:不言自明
        • POSTFIX_KEYVALUE:结合 POSTFIX_QUEUEID 和 POSTFIX_KEYVALUE_DATA。
        • POSTFIX_SMTP_DELIVERY:使用 POSTFIX_KEYVALUE 识别上述信息,直到 status=,之后是 SMTP 响应。

      过滤器:

      filter {
          if [type] == "postfix" {
              grok {
                  patterns_dir   => "/etc/logstash/patterns"
                  match => { "message" => "%{SYSLOG5424PRI}%{SYSLOGTIMESTAMP} %{SYSLOGPROG}: %{POSTFIX_SMTP_DELIVERY}" }
              }
          }
      }
      

      您将在 patterns_dir 中保存后缀模式的位置。

      输出:

      {
          "postfix_queueid" => "28D40A036B",
          "@timestamp" => 2017-02-23T08:15:32.546Z,
          "postfix_smtp_response" => "250 2.0.0 Ok: queued as 9030A15D0",
          "port" => 50228,
          "postfix_keyvalue_data" => "to=<test@gmail.com>, relay=192.244.100.25[192.244.100.25]:25, delay=0.13, delays=0.01/0.01/0.09/0.02, dsn=2.0.0, status=sent",
          "syslog5424_pri" => "22",
          "@version" => "1",
          "host" => "10.0.2.2",
          "pid" => "18852",
          "program" => "postfix/smtp",
          "message" => "<22>Sep 17 19:12:14 postfix/smtp[18852]: 28D40A036B: to=<test@gmail.com>, relay=192.244.100.25[192.244.100.25]:25, delay=0.13, delays=0.01/0.01/0.09/0.02, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 9030A15D0)"
      }
      

      以上所有的 grok 过滤器要么是common,要么是由其他人编写的,以服务于某个目的。幸运的是,很多人使用 Postfix,但很少有人为它编写过滤器,因为它相当复杂。

      一旦建立,您就可以使用 Logstash 配置获得漂亮的crafty

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-07
        • 1970-01-01
        相关资源
        最近更新 更多