如何从 logstash 的日志文件中提取 CPU 使用细节
How to extract CPU Usage details from the log file in logstash
我正在尝试从消息中提取 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 解析错误,我们将不胜感激。谢谢
根据 Magnus 的消息,您错误地使用了 grok 匹配函数,@timestamp 是系统字段的名称,logstash 将其用作收到消息的时间戳,而不是 grok 模式的名称.
首先,我建议您查看一些您可以使用的默认 grok 模式,可以找到这些模式 here, then I also recommend you use the 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 中的名称。
希望对您有所帮助!
我正在尝试从消息中提取 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 解析错误,我们将不胜感激。谢谢
根据 Magnus 的消息,您错误地使用了 grok 匹配函数,@timestamp 是系统字段的名称,logstash 将其用作收到消息的时间戳,而不是 grok 模式的名称.
首先,我建议您查看一些您可以使用的默认 grok 模式,可以找到这些模式 here, then I also recommend you use the 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 中的名称。
希望对您有所帮助!