8

我有点困惑。我正在尝试拔出syslog date (backfilling the logstash)并用它替换@timestamp。我几乎什么都试过了。

这是我的过滤器

filter {
   if [type] == "syslog" {
   grok {
     match => {
"message" => ["%{SYSLOGTIMESTAMP:DATETIME} %{WORD:SERVER} (?<BINARY>(.*?)(php\-cgi|php))\: %{DATA:PHP_ERROR_TYPE}\:\s\s(?<PHP_ERROR_DESC>(.*?)(e\s\d))""]
  }
}

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

if !("_grokparsefailure" in [tags]) {
  mutate {
    replace => [ "@source_host", "%{SERVER}" ]
  }
}
mutate {
  remove_field => [ "SERVER" ]
}
}
}

样本输出:

{
    "message" => "Sep 10 00:00:00 xxxxxxx",
    "@timestamp" => "2013-12-05T13:29:35.169Z",
      "@version" => "1",
          "type" => "xxxx",
          "host" => "127.0.0.1:xxx",
      "DATETIME" => "Sep 10 00:00:00",
        "BINARY" => "xxxx",
"PHP_ERROR_TYPE" => "xxxx",
"PHP_ERROR_DESC" => "xxxxx",
          "tags" => [
    [0] "tmatch"
],
  "@source_host" => "xxx"
}

tmatch 在标签中,所以我假设日期过滤器有效,但为什么我仍然有:

@timestamp => "2013-12-05T13:29:35.169Z"

?

感谢您的帮助(我logstash的是logstash-1.2.2-flatjar.jar

4

2 回答 2

10

让我们看一下您的日期过滤器:

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

特别是match参数:

match => { "DATETIME" => [ "MMM  d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601" ] }

Match 需要一个数组。我不确定你到底传递了什么,但它绝对不是一个数组。我尝试用 运行它-v,我很惊讶它没有抱怨。

你的意思可能更接近这个:

match => ["DATETIME", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601"]

注意数组的第一个元素是目标字段;其他元素是要匹配的模式。

除此之外,您实际上只需要传递您期望的一种格式,但看起来它包含在您发送的三种格式中。

于 2013-12-05T21:57:04.640 回答
7

如果您希望时间戳显示为您的时区格式,而不是 UTC 时间,您可以这样做

ruby {
    code => "event['@timestamp'] = event['@timestamp'].local('-08:00')"
}

前:@timestamp => "2013-12-05T13:29:35.169Z"

后 :@timestamp => "2013-12-05T05:29:35.169-08:00"

更新:本地方法在 1.4.2 版本中无法使用。因此,更改另一个 API

ruby {
    code => "event['@timestamp'] = event['@timestamp'].getlocal"
}
于 2013-12-10T13:31:32.347 回答