自动映射syslog“message”部分中的字段

时间:2015-02-03 08:37:42

标签: logstash logstash-grok

是否可以自动映射syslog收到的事件的字段,如果它们遵循格式field1=value1 field2=value2 ...?一个例子是

name=john age=15
age=29 name=jane
name=mark car=porshe

(请注意,字段不同,并不总是存在)

我正在考虑的解决方案之一是将syslog“message”部分作为JSON发送,但我不确定是否可以自动解析它(当其余日志采用syslog格式时)。我当前的方法失败了_jsonparsefailure,但我会继续尝试

input {
  tcp
    {
      port => 5514
      type => "syslogandjson"
      codec => json
    }

}

filter{
    json{
      source => "message"
    }
}

output ...

1 个答案:

答案 0 :(得分:1)

具有key = value格式的字段可以使用kv filter进行解析,但不支持具有双引号值的字段,即

key1=value1 key2="value2 with spaces" key3=value3

或(甚至更糟)

key1=value1 key2=value2 with spaces key3=value3

不会好。

将消息作为JSON发送更好,但正如您所发现的那样,您无法使用json codec,因为编解码器适用于整个消息(时间戳和所有消息),而不仅仅是您的消息部分可以找到序列化的JSON字符串。尽管你在json filter的正确轨道上。只需确保在解析原始syslog消息的grok filter之后有过滤器,以提取时间戳,严重性等。你会想要这样的东西:

filter {
  grok {
    match => [...]
    # Allow replacement of the original message field
    overwrite => ["message"]
  }
  date {
    ...
  }
  json {
    source => "message"
  }
}

由于可能并非您收到的所有邮件都是JSON邮件,因此您可能需要围绕json过滤器设置条件。或者,尝试对所有消息进行JSON解析,但删除过滤器为无法解析的消息添加的任何_jsonparsefailure标记。