我有一个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}
等。如何从Apache时间戳中提取“星期几”和“一年中的星期”之类的字段?
(我可以使用Kibana的脚本字段提取所需的值,但是它们看起来很慢,并且Kibana无法查询脚本字段,所以这不是一个很好的解决方案。)
使用Logstash 6.0
最佳答案
我不知道您使用的具体时间格式,因此我用apache时间戳进行了搜索,发现了这一点:
[Wed Oct 11 14:32:52 2000]
我去了这个地方:
http://grokconstructor.appspot.com/do/match#result
并使用此grok模式:
%{DAY:day} %{MONTH:month} %{NUMBER:year} %{NUMBER:hour}:%{NUMBER:minute}:%{NUMBER:second} %{NUMBER:millisecond}
使用grok match字段应该在您的记录中生成新字段,因此不需要add_field。请记住,grok模式匹配在特殊字符周围可能很棘手,这就是我尝试将方括号省略的原因,它对我有用。
同样不要忘记,测试人员站点明确要求不要使用引号,但是您仍然需要在配置文件中使用引号。
关于elasticsearch - 从日期时间字段的一部分创建新字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48197451/