【问题标题】:Logstash date filter in a special case特殊情况下的 Logstash 日期过滤器
【发布时间】:2014-12-17 19:10:40
【问题描述】:

我的日志格式如下:

201407022000.log:2014-07-02 20:00;10.112.64.250;3;972819;ULC Primeline

因为它是一个 csv,我可以像这样很容易地拆分第一部分:

csv {
    columns => ["fulldate","ip","port","electricity","customer"]
    separator => ";"
    remove_field => "message" 
}

现在我想将我的 fulldate 字段拆分为“日期之前的任何内容”(201407022000.log:)和实际日期字段(2014-07-02 20:00

我尝试像这样使用日期过滤器:

date {
    match => [ "fulldate", "YYYY-MM-dd HH:mm" ]
    timezone => "Europe/Berlin"
}

我收到以下错误

从字段 {:field=>"date" 解析日期失败, :value=>"201407022000.log:2014-07-02 20:00", :exception=>java.lang.IllegalArgumentException: 格式无效: “201407022000.log:2014-07-02 20:00”格式不正确 "000.log:2014-07-02 20:00", :level=>:warn}

不幸的是,这不起作用,logstash 解析失败。

【问题讨论】:

    标签: logstash


    【解决方案1】:

    它失败的原因是你试图解析这个:

    201407022000.log:2014-07-02 20:00
    

    使用与格式匹配的过滤器:

    "YYYY-MM-dd HH:mm"
    

    您可以做的是在解析之前对该字段使用 grok:

    filter {
      grok {
        match => { "fulldate" => "[0-9.]+log:%{TIMESTAMP_ISO8601:date}" }
      }
    }
    

    如果您还想在开始时捕获文件名,您可以创建一个新模式,例如(该模式将放在模式目录中的文件中,通常是基于 UNIX 的系统中的 /opt/logstash/patterns):

    LOGFILENAMEPATTERN [0-9.]+log
    

    那么你的 grok 会变成:

    filter {
      grok {
        match => [ "fulldate" => "%{LOGFILENAMEPATTERN:filename}:%{TIMESTAMP_ISO8601:date}" ]
      }
    }
    

    最后你的日期模式会变成:

    date {
        match => [ "date", "yyyy-MM-dd HH:mm" ]
        timezone => "Europe/Berlin"
    }
    

    请注意,我已经更改了您要匹配的字段的名称,因为我在 grok 中将其重命名,并且我已将 YYYY 替换为 yyyy,因为 Y 是时代的年份,y 是年份,它们不是相同(根据documentation

    【讨论】:

    • 你太棒了 :D 我不得不在 grok 比赛中将 "=>" 替换为 "," 但后来一切正常! :))
    • 很高兴它有帮助:) 我把 grok 的语法弄混了,现在更正了,它应该是 {} 和 => 或 [] 和 ,IIRC [] 和 ,是较旧的符号
    • 真的,我也试过你的新变种,效果也很好:)谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-10-20
    • 2016-05-21
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多