使用logstash分析sensu日志
Analyze sensu log with logstash
这是我在服务器上的 sensu 日志:
{"timestamp":"2015-01-21T09:43:21.387501+0700","level":"info","message":"publishing check result","payload":{"client":"local.com","check":{"name":"instance_xxx_check","issued":1421808200,"command":"xargs -I{} sh -c '/opt/sensu/embedded/bin/ruby /etc/sensu/plugins/check-http.rb -u {}' < /etc/sensu/conf.d/live/list/xxx.txt","handlers":["default","mailer"],"interval":60,"subscribers":["live"],"executed":1421808200,"duration":1.317,"output":"CheckHTTP OK: 200, http://link1.com\nCheckHTTP CRITICAL: Request error: http://link2.com\nCheckHTTP OK: 200, http://link3.com\n","status":123}}}
此为json格式,可使用json解析查看
并且在通过 logstash 过滤器之后,它将解析为如下图所示的字段:
http://i.stack.imgur.com/4KA0i.jpg
现在我想添加一个名为 "error" 的字段,它只包含关键“http://link.com”的信息。这意味着,如果过滤器在 "payload.check.output" 字段中匹配 CheckHTTP CRITICAL,它会将错误 [=33=] 添加到新的 "error" 字段
这是我在 logstash 过滤器中的配置:
if [type] == "sensu" {
grok {
match => [ "payload.check.output", "%{CISCO_REASON}: Request error: %{URI}" ]
}
mutate {
add_field => { "error" => "%{payload.check.output}" }
remove_field => [ "timestamp" ]
}
}
但什么也没发生
您可以尝试使用此配置访问嵌套的 json 消息。
input {
stdin{}
}
filter {
json {
source => "message"
}
if [payload][check][output] =~ /CheckHTTP CRITICAL/
{
ruby
{
code => "
errormsg = '';
msg = event['payload']['check']['output'];
splitmsg = msg.split(/\n/)
for splitlog in splitmsg
if splitlog.include? 'CheckHTTP CRITICAL'
errormsg = errormsg + splitlog.split('error: ')[1];
end
end
event['error'] = errormsg
"
}
}
}
output {
stdout {
codec => rubydebug
}
}
以上配置可以解析出错误link并插入到error
字段。
如果您发现您的需求难以通过logstash插件实现,您可以尝试使用ruby
过滤器自己编码。所以,下次你可以自己尝试一下。好好享受。
希望对您有所帮助。
这是我在服务器上的 sensu 日志:
{"timestamp":"2015-01-21T09:43:21.387501+0700","level":"info","message":"publishing check result","payload":{"client":"local.com","check":{"name":"instance_xxx_check","issued":1421808200,"command":"xargs -I{} sh -c '/opt/sensu/embedded/bin/ruby /etc/sensu/plugins/check-http.rb -u {}' < /etc/sensu/conf.d/live/list/xxx.txt","handlers":["default","mailer"],"interval":60,"subscribers":["live"],"executed":1421808200,"duration":1.317,"output":"CheckHTTP OK: 200, http://link1.com\nCheckHTTP CRITICAL: Request error: http://link2.com\nCheckHTTP OK: 200, http://link3.com\n","status":123}}}
此为json格式,可使用json解析查看
并且在通过 logstash 过滤器之后,它将解析为如下图所示的字段:
http://i.stack.imgur.com/4KA0i.jpg
现在我想添加一个名为 "error" 的字段,它只包含关键“http://link.com”的信息。这意味着,如果过滤器在 "payload.check.output" 字段中匹配 CheckHTTP CRITICAL,它会将错误 [=33=] 添加到新的 "error" 字段
这是我在 logstash 过滤器中的配置:
if [type] == "sensu" {
grok {
match => [ "payload.check.output", "%{CISCO_REASON}: Request error: %{URI}" ]
}
mutate {
add_field => { "error" => "%{payload.check.output}" }
remove_field => [ "timestamp" ]
}
}
但什么也没发生
您可以尝试使用此配置访问嵌套的 json 消息。
input {
stdin{}
}
filter {
json {
source => "message"
}
if [payload][check][output] =~ /CheckHTTP CRITICAL/
{
ruby
{
code => "
errormsg = '';
msg = event['payload']['check']['output'];
splitmsg = msg.split(/\n/)
for splitlog in splitmsg
if splitlog.include? 'CheckHTTP CRITICAL'
errormsg = errormsg + splitlog.split('error: ')[1];
end
end
event['error'] = errormsg
"
}
}
}
output {
stdout {
codec => rubydebug
}
}
以上配置可以解析出错误link并插入到error
字段。
如果您发现您的需求难以通过logstash插件实现,您可以尝试使用ruby
过滤器自己编码。所以,下次你可以自己尝试一下。好好享受。
希望对您有所帮助。