Logstash日期过滤器不再匹配

时间:2014-10-30 23:50:34

标签: elasticsearch logstash kibana

我正在开发一个内部部署的ELK服务集群,并在一些初始测试机器上解决了我的配置,我现在将其移植到Chef cookbook上。为了使我的食谱更具可扩展性,我将Logstash配置模板编写为单个函数,该函数读取Chef节点数据并输出配置。引用的一些特性需要允许LS配置文件的嵌套结构。

无论如何,一旦我开始从我的测试机器获取数据,我注意到Logstash再次使用事件被收到@timestamp的时间戳而不是从事件中提取的时间戳。我不知道为什么。

以下是我的初始测试机器和当前测试机器的配置和事件样本。我已经将过滤器语句减少到date部分,并删除了除相关事件数据之外的所有内容。

初始版本:

filter {
    date {
        match => ["timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601"]
        target => "@timestamp"
    }
}

解析事件:

{
    "message": "Oct  1 05:32:07 web-01-01 postfix/smtp[12517]: 0E3E263266: to=<foo@blah.com>, relay=mta.blah.net[1.2.3.4]:25, delay=1.4, delays=0.23/0/0.11/1, dsn=2.0.0, status=sent (250 ok dirdel)",
    "@timestamp": "2014-10-01T05:32:07.000Z",
    "timestamp": "Oct  1 05:32:07",
}

厨师版:

filter {
    date {
        "match" => [
            "timestamp",
            "MMM  d HH:mm:ss",
            "MMM dd HH:mm:ss",
            "ISO8601"
        ]
        "target" => "@timestamp"
    }
}

解析事件:

{
    "message": "Oct 29 16:45:15 web-01-01 postfix/smtp[18596]: 05D9D63FA0: to=<foo@bla.com>, relay=mailin-01.mx.blah.com[1.2.3.4]:25, delay=1.1, delays=0.03/0/0.34/0.75, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 7B67F7000557B)",
    "@timestamp": "2014-10-30T18:41:33.660Z",
    "timestamp": "Oct 29 16:45:15",
}

提前致谢。

编辑:

以下是完整的过滤器部分,包括grok部分:

filter {
    date {
        "match" => [
            "timestamp",
            "MMM  d HH:mm:ss",
            "MMM dd HH:mm:ss",
            "ISO8601"
        ]
        "target" => "@timestamp"
    }
    grok {
        "type" => "postfix"
        "patterns_dir" => [
            "/opt/logstash/etc/grok_patterns"
        ]
        "pattern" => [
            "%{SYSLOGBASE} %{POSTFIXSMTPDCONNECTS}",
            "%{SYSLOGBASE} %{POSTFIXSMTPDACTIONS}",
            "%{SYSLOGBASE} %{POSTFIXSMTPDTIMEOUTS}",
            "%{SYSLOGBASE} %{POSTFIXSMTPDLOGIN}",
            "%{SYSLOGBASE} %{POSTFIXSMTPDCLIENT}",
            "%{SYSLOGBASE} %{POSTFIXSMTPRELAY}",
            "%{SYSLOGBASE} %{POSTFIXSMTPCONNECT}",
            "%{SYSLOGBASE} %{POSTFIXSMTP4XX}",
            "%{SYSLOGBASE} %{POSTFIXSMTP5XX}",
            "%{SYSLOGBASE} %{POSTFIXSMTPREFUSAL}",
            "%{SYSLOGBASE} %{POSTFIXSMTPLOSTCONNECTION}",
            "%{SYSLOGBASE} %{POSTFIXSMTPTIMEOUT}",
            "%{SYSLOGBASE} %{POSTFIXBOUNCE}",
            "%{SYSLOGBASE} %{POSTFIXQMGR}",
            "%{SYSLOGBASE} %{POSTFIXCLEANUP}"
        ]
        "named_captures_only" => "true"
    }
}

后缀模式来自https://gist.github.com/jbrownsc/4694374,但我不认为它们在这种情况下非常重要。

2 个答案:

答案 0 :(得分:1)

我根据你的配置构建了以下配置,它可以工作。配置中唯一奇怪的事情是复制&#39; @ message&#39;到时间戳&#39;。这通常是由你的grok {}(你没有发布)完成的,虽然我们确实看到你确实有一个有效的时间戳&#39;字段。

input {
        stdin{}
}

filter {
    mutate {
       add_field => [ "timestamp", "%{message}" ]
    }

    date {
        "match" => [
            "timestamp",
            "MMM  d HH:mm:ss",
            "MMM dd HH:mm:ss",
            "ISO8601"
        ]
        "target" => "@timestamp"
    }
}

output {
        stdout{ codec => rubydebug }
}

和输出,显示正确设置的@timestamp。

{
       "message" => "Oct 29 16:45:15",
      "@version" => "1",
    "@timestamp" => "2015-10-29T23:45:15.000Z",
          "host" => "0.0.0.0",
     "timestamp" => "Oct 29 16:45:15"
}

答案 1 :(得分:0)

这一切似乎都归结为指定过滤器的顺序。 grok过滤器是创建timestamp字段的原因,因此如果首先指定了日期过滤器,则它无需操作。

撤销订单以便grok在日期之前到来解决了问题,而且只用了整整10个月就搞清了!