从datetime字段的部分创建新字段

时间:2018-01-10 22:56:29

标签: elasticsearch logstash kibana

我有一个logstash管道,它从apache日志条目中提取日期并将其保存在新字段中:

date {
  match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
  target => "@apache_timestamp"
}

我也希望能够将这个日期的部分内容提取到单独的字段中,以用于某些特定的报告。

我尝试在日志的新日期字段中使用date插件:

date {
  match => ["@apache_timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
  add_field => {"[hourOfDay]" => "%{+HH}"}
  add_field => {"[dayOfWeek]" => "%{+EEE}"}
  add_field => {"[weekOfYear]" => "%{+ww}"}
  add_field => {"[monthName]" => "%{+MMMM}"}
  add_field => {"[year]" => "%{+yyyy}"}
}

但它似乎没有添加任何新字段。

我还尝试直接在邮件中使用grok插件:

grok {
  match => { "message" => ["%{HTTPDATE}"] }
  add_field => {"[hourOfDay]" => "%{HOUR}"}
  add_field => {"[monthName]" => "%{MONTH}"}
  add_field => {"[year]" => "%{YEAR}"}
}

这会添加字段,但它们具有文字值%{HOUR}%{MONTH}等等。

如何提取字段,例如"星期几"和#34;一年中的一周"来自Apache时间戳?

(我能够使用Kibana的脚本字段提取我需要的值,但它们似乎相当慢,Kibana无法查询脚本字段,因此它不是一个很好的解决方案。 )

使用Logstash 6.0

2 个答案:

答案 0 :(得分:1)

我不知道你具体的时间格式,所以我用谷歌搜索了一个apache时间戳,发现了这个:

[Wed Oct 11 14:32:52 2000]

我去了这个地方:
http://grokconstructor.appspot.com/do/match#result
并使用了这个格鲁克模式:

%{DAY:day} %{MONTH:month} %{NUMBER:year} %{NUMBER:hour}:%{NUMBER:minute}:%{NUMBER:second} %{NUMBER:millisecond}

使用grok匹配字段应该在记录中生成新字段,因此不需要add_field。请记住,特殊字符周围的grok模式匹配可能很棘手,这就是我试图将括号括起来的原因,它对我有用。
另外请不要忘记,测试人员网站特别要求不使用引号,但您仍然需要配置文件中的那些。

答案 1 :(得分:0)

对于我所拥有的行,我需要使用这个grok表达式:

grok {
  match => { "message" => ["^.*%{MONTHDAY:dayOfMonth}\/%{MONTH:monthName}\/%{YEAR:year}:(?!<[0-9])%{HOUR:hourOfDay}:%{MINUTE}(?::%{SECOND})(?![0-9]) %{INT:utcOffset}.*$"] }
}

使用此日志行:

  

192.168.0.1 - - [01 / Jan / 2017:00:00:00 -0500]“GET /some-image-file.png HTTP / 1.1”200 13281“ - ”“MobileSafari / 602.0 CFNetwork / 808.2。 13达尔文/ 16.3.0“” - “” - “

我可以提取这样的字段:

monthName   Jan
year    2017
hourOfDay   00
dayOfMonth  1
utcOffset   -0500

我仍然无法获得DayOfWeek字段(星期日,星期一,星期二等等),但现在这可能还不错。

修改

我能够得到星期和一年中的一周,但我需要在Ruby中做到这一点:

ruby {
    code => 'event.set("dayOfWeek", Time.parse(event.get("@apache_timestamp").to_s).strftime("%A"))'
}
ruby {
    code => 'event.set("weekOfYear", Time.parse(event.get("@apache_timestamp").to_s).strftime("%W"))'
}

供参考:

这样的语法:

add_field => {"[dayOfWeek]" => "%{+EEE}"}

似乎才能使用@timestamp。我不认为在其他日期时间字段(例如我的@apache_timestamp)上使用该语法还有其他方法,因此丑陋的Ruby解决方案。