0

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

信息:

<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字段?

4

2 回答 2

0

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

于 2013-10-03T04:18:33.257 回答
0

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

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

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

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

  • <22>Sep 17 19:12:14 postfix/smtp[18852]::这非常接近 RFC5424 系统日志,但它缺少ver(版本)字段。

    • SYSLOG5424PRI:优先级值
    • SYSLOGTIMESTAMP:不言自明
    • SYSLOGPROG:应用程序的名称
  • 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):这是 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 模式的位置。

输出:

{
    "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 过滤器要么是常见的,要么是由其他人编写的以服务于某个目的。幸运的是,很多人使用 Postfix,但很少有人为它编写过滤器,因为它相当复杂。

一旦建立起来,您就可以非常巧妙地使用Logstash配置。

于 2017-02-23T08:17:22.197 回答