基本上,我希望LogStash使用自己的日志并填充@timestamp
,level
等字段,以便在Kibana中使用。
我当前的配置如下所示:
input {
file {
path => "/path/to/logstash/logs/*.log"
type => "logstash"
}
}
这似乎很难做到 - 没有回复写Grok过滤器。 LogStash是否真的无法使用自己的日志? (很难谷歌,我找不到任何东西。)
或者这首先是错误的做法?
LogStash的日志输出示例:
{
:timestamp=>"2014-09-02T10:38:08.798000+0200",
:message=>"Using milestone 2 input plugin 'file'. This plugin should be stable, but if you see strange behavior, please let us know! For more information on plugin milestones, see http://logstash.net/docs/1.4.2/plugin-milestones",
:level=>:warn
}
答案 0 :(得分:5)
您必须使用grok
,因为logstash无法使用rubydebug
作为输入编解码器。
日志采用固定格式,因此grok
可以直接执行。然后,我们使用date
替换@timestamp
filter {
grok {
match => ["message", '{:timestamp=>"(?<timestamp>.*)", :message=>"(?<msg>.*)", :level=>:(?<level>.*)}']
}
mutate {
replace => ["message", "%{msg}" ]
remove_field => msg
}
date {
match => [ "timestamp", "ISO8601" ]
remove_field => 'timestamp'
}
}
需要执行mutate
步骤,因为如果您只是将<message>
放入匹配项中,它会将message
转换为数组并将提取的消息添加到数组中,因此将其捕获为不同的名称,然后替换消息。
答案 1 :(得分:1)
是的,你可以这样做。
请将您的logstash控制台日志保存到文件中。
然后,您可以使用ruby filter
或grok filter
来解析信息。
以下是示例:
input {
file {
path => "/path/to/logstash/logs/*.log"
}
}
filter {
ruby {
code => "
mes = event['message'];
startPos = mes.index('level=>');
endPos = mes.length;
event[':level'] = mes[startPos+7..endPos-2];
"
}
}
output {
stdout {
codec => "rubydebug"
}
}