我正在尝试从消息中提取CPU使用情况和时间戳:
2015-04-27T11:54:45.036Z| vmx| HIST ide1 IRQ 4414 42902 [ 250 - 375 ) count: 2 (0.00%) min/avg/max: 250/278.50/307
我正在使用logstash,这是我的logstash.config文件:
input {
file {
path => "/home/xyz/Downloads/vmware.log"
start_position => beginning
}
}
filter {
grok{
match => ["message", "%{@timestamp}"]
}
}
output{
stdout {
codec => rubydebug
}
}
但是它给了我grok解析错误,任何帮助都会非常感激。感谢。
答案 0 :(得分:2)
根据来自Magnus的消息,您正在错误地使用grok匹配功能,@ timestamp是logstash用作收到消息的时间戳的系统字段的名称,而不是grok模式的名称
首先,我建议您查看一些可以使用的默认grok模式here,然后我还建议您最终使用grok debugger,如果其他所有操作都失败,请获取你自己在#logstash irc频道(在freenode上),我们在那里非常活跃,所以我相信有人会帮助你。
为了帮助你更进一步,这是我创建的一个快速的grok模式,它应该与你的例子匹配(我只使用grok调试器来测试它,因此生产中的结果可能不完美 - 所以测试它! )
filter {
grok {
match => [ "message", "%{TIMESTAMP_ISO8601}\|\ %{WORD}\|\ %{GREEDYDATA}\ min/avg/max:\ %{NUMBER:minimum}/%{NUMBER:average}/%{NUMBER:maximum}" ]
}
}
要稍微解释一下,%{TIMESTAMP_ISO8601}是默认的grok模式,它与您示例中的时间戳匹配。
你会注意到使用\非常多,因为后面的字符需要被转义(因为我们正在使用正则表达式引擎和空格,管道等有意义,通过逃避它们我们禁用了这个含义并按字面意思使用它们。
我使用了%{GREEDYDATA}模式,因为它会捕获任何内容,当你只想捕获其余的消息时,这可能很有用,如果你把它放在grok模式的末尾,它将捕获所有剩余的文本。 然后我从你的例子中取了一点(min / avg / max)来阻止GREEDYDATA捕获剩下的消息,因为我们想要之后的数据。
显然,%{NUMBER}会捕获数字,但是花括号内的位置定义了logstash给出的字段名称,随后保存在elasticsearch中。
我希望有所帮助!