2014-09-25 286 views
3

我有这个日志打印日期的格式,看起来像这样:Logstash自定义日期日志格式匹配

=   Build Stamp: 10:45:33 On Apr 4 2014   = 

,所以我必须运行神交调试器中的过滤器,但是,如何删除仍然一无所知字

grok { 
patterns_dir => "./patterns" 
match => { "message" => "%{F_TIMESTAMP:timestamp}" } 
} 

date { 
match => [ "timestamp" , "HH:mm:ss MMM d yyyy" , "HH:mm:ss MMM dd yyyy" ] 
locale => "en" 
} 

模式文件,

F_TIMESTAMP %{TIME} \On %{MONTH} +%{MONTHDAY} %{YEAR} 

我当前输出的时间戳记为

10:45:33 2014年4月4日在Grok调试器上。

那么我怎样才能使它兼容/匹配logstash @timestamp?

回答

7

您可以提取日期时间的每个部分,并在没有On关键字的情况下合并到另一个字段中。

你可以做到这一点如下:

filter { 
    grok {   
     match => { "message" => "%{F_TIMESTAMP}" } 
    } 
    mutate { 
     add_field => { 
      "timestamp" => "%{time} %{month} %{monthday} %{year}" 
     } 
    } 
    date { 
     match => [ "timestamp" , "HH:mm:ss MMM d yyyy" , "HH:mm:ss MMM dd yyyy" ] 
     locale => "en" 
    } 
    mutate { 
     remove_field => [ "time" ,"month","monthday","year","timestamp"] 
    } 
} 

F_TIMESTAMP %{TIME:time}\s*On\s*%{MONTH:month}\s*%{MONTHDAY:monthday}\s*%{YEAR:year}

其工作对我罚款。

+0

谢谢,这适用于我,但后来我发现小时标记HH在@timestamp“=>”2014-04-04T02:45:33.000Z中显示不正确,因为您可以看到HH部分变为02而不是10.然后,我已经删除了mutate remove_field标签,以便实际查看小时部分显示的时间戳记10是什么,所以现在它真的让我感到困惑。 – 2014-09-25 14:38:49

+0

logstash将10更改为2,因为我的位置是来自UTC的+8。所以如果我在不同的位置/国家运行这个,它将会是不同的价值。我想我需要为此添加时区字段。 – 2014-09-25 15:06:45

+0

是的..您需要将其转换为当地时间。可以通过ruby脚本完成:'ruby {code =>“event ['@ timestamp'] = event ['@ timestamp']。getlocal”}' – 2014-09-25 17:48:42