【问题标题】:Logstash replace @timestamp with syslog dateLogstash 用 syslog 日期替换 @timestamp
【发布时间】:2013-12-22 11:48:09
【问题描述】:

我有点困惑。我正在尝试拔出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"

?

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

【问题讨论】:

    标签: filter timestamp logstash syslog logstash-grok


    【解决方案1】:

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

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

    之前:@timestamp =&gt; "2013-12-05T13:29:35.169Z"

    之后:@timestamp =&gt; "2013-12-05T05:29:35.169-08:00"

    更新: 本地方法在 1.4.2 版本中无法使用。 所以,换一个 API

    ruby {
        code => "event['@timestamp'] = event['@timestamp'].getlocal"
    }
    

    【讨论】:

    • 这真的行不通。它给出以下错误“异常”=>#。你试过这个吗?
    • 我正在使用日志存储 1.4.2。在 ES 中进行索引时,我需要能够将日期转换为 UTC 格式。有什么想法可以实现吗?
    • 我已经更新了答案!请尝试一下。感谢您的信息!
    • 谢谢。这行得通!但它只适用于像@timestamp 这样的元数据字段。当我尝试将它与具有相似时间戳的字段一起使用时,它没有。我尝试这样做,代码 => "event['syslog_timestamp'] = event['syslog_timestamp'].getlocal('-08:00')" 但它因 NoMethodError 而失败..你知道为什么吗?
    • 请确保您的字段是时间戳,类型,而不是字符串。当你解析你的日志时,可能字段格式是字符串,所以你需要将它转换为时间戳类型
    【解决方案2】:

    让我们看看你的日期过滤器:

    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"]
    

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

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

    【讨论】:

    • 嘿,感谢您的回复!我读到最近比赛的结构发生了变化。但是我已经尝试了您的解决方案,但它仍然无法正常工作。我有合理的假设认为 Joda 时间库是一个问题。在 Logstash JIRA 上报告错误:logstash.jira.com/browse/LOGSTASH-1686
    • 很高兴知道。以后我会注意的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2020-02-19
    相关资源
    最近更新 更多