如何从 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 中的名称。

希望对您有所帮助!