我有一个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
答案 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解决方案。