logstash解析日志字段

时间:2013-09-17 19:01:24

标签: regex parsing logstash postfix

我正在尝试解析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字段?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

不幸的是,Postfix在日志记录中有一些非常烦人的模式,因为少数人已经编写了一些patterns来解释你在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 :用作另一个过滤器的组件,以匹配键=值数据(例如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过滤器都是common或由其他人编写以达到目的。幸运的是,许多人使用Postfix,但很少有人为它编写过滤器,因为它相当复杂。

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