【问题标题】:Logstash "date" filter doesn't replace @timestampLogstash“日期”过滤器不会取代@timestamp
【发布时间】:2014-12-10 18:03:49
【问题描述】:

由于某种原因,当我尝试替换我的 apache 访问日志事件中的 @timestamp 字段时,它不起作用。对于 Nginx,它确实可以使用相同的日期格式。

这是我的日志日期格式:[10/Dec/2014:13:01:06 -0500]

这是我的 logstash.conf -

if [type] == "apache" {
   grok {
        match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:time}\] \"(?:%{WORD:method} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-)" }
        add_tag => [ "apache", "grokked" ]
        }
   date {
        match => [ "[time]" , "dd/MMM/YYYY:HH:mm:ss Z" ]
        locale => "en"
        add_tag => ["date_filtered"]
        }
     }

@timestamp 字段保持这种格式 - 2014-12-10T18:01:06.000Z

更新: 这是完整的配置 -

日志中没有错误,只有logstash启动日志行。

我的logstash配置文件如下:

input {
redis {
        host => "<redis_server>"
        port => "<redis_port>"
        data_type => 'list'
        key => 'logstash'
        type => 'redis'
        threads => 300
 }

filter {


multiline {
        pattern => "(^\s)|(^INFO.+)|(^SEVERE.+)"
        what => "previous"
        add_tag => ["multiline"]
        stream_identity => '%{host}.%{file}.%{type}'

   }

if [type] == "apache" {
   grok {
        match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:time}\] \"(?:%{WORD:method} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-)" }
        add_tag => [ "apache", "grokked" ]
        }
   date {
        match => [ "[time]" , "dd/MMM/YYYY:HH:mm:ss Z" ]
        locale => "en"
        add_tag => ["date_filtered"]
        }
     }
}

output {

  elasticsearch {
    host => "<ES_server>"
    port => "9300"
    cluster => "elasticsearch"
    embedded => false
    node_name => "logstash"
   }
}

结果是:

什么时候应该是:

谢谢。

【问题讨论】:

  • 我在你的 grok 过滤器中没有看到 time ?你是如何从message 中提取时间的?
  • @Vaibhav: \[%{HTTPDATE:time}\] 包含在模式中。
  • 我在 grok 过滤器中提取它 - [%{HTTPDATE:time}]
  • @user3323914:不确定你在这里问的是什么。您的最后一条语句表明您希望时间戳字段具有另一个 format,但该字段的格式是 always ISO8601,如您的示例所示。还是日期过滤器无法解析时间戳的问题?如果是这样,日志将包含指向正确方向的错误消息。
  • @MagnusBäck,谢谢。如果我理解正确,这是两种不同的格式? - [10/Dec/2014:13:01:06 -0500] 和 2014-12-10T18:01:06.000Z ?你知道我应该怎么做才能使它与当前格式一起工作吗?谢谢!

标签: apache logstash


【解决方案1】:

平均而言,只有 1/1000 条日志在毫秒 = 000 时被处理,如您的 @timestamp 所示。

您能猜出将 HH:mm:ss 传递给 date{} 时会发生什么吗?没错 - 输入中没有提供毫秒信息,它被设置为 000。

所以,我认为您的 date{} 节运行良好。

您可以通过在输出中查找标签“date_filtered”来确认这一点;仅当日期成功时才会添加标签。

【讨论】:

  • 感谢您的回复。我的问题不是毫秒,而是我所在领域的小时数之间的差异。 @timestamp 字段表示 11:34,而 time 字段表示 06:34。同样,我觉得我在这里遗漏了一些明显的东西,但我想完全弄清楚。谢谢!
  • 我刚刚意识到这是一个时区差异,哎呀!谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-01-13
  • 2014-10-20
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多