Logstash 自动映射syslog中的字段;讯息;部分

Logstash 自动映射syslog中的字段;讯息;部分,logstash,logstash-grok,Logstash,Logstash Grok,如果事件遵循格式field1=value1 field2=value2…,是否可以自动映射syslog接收的事件的字段?例如 name=john age=15 age=29 name=jane name=mark car=porshe (请注意,字段是不同的,并不总是存在) 我正在考虑的解决方案之一是将syslog“message”部分作为JSON发送,但我不确定是否可以自动解析它(当日志的其余部分是syslog格式时)。我当前的方法因\u jsonparsefailure而失败,但我会继续尝

如果事件遵循格式
field1=value1 field2=value2…
,是否可以自动映射syslog接收的事件的字段?例如

name=john age=15
age=29 name=jane
name=mark car=porshe
(请注意,字段是不同的,并不总是存在)

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

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

}

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

output ...

可以使用解析键=值格式的字段,但它不支持双引号值的字段,即

key1=value1 key2="value2 with spaces" key3=value3
或者(更糟)

结果不会好的

将消息作为JSON发送要好得多,但正如您所发现的,您不能使用,因为编解码器应用于整个消息(时间戳和all),而不仅仅是可以找到序列化JSON字符串的消息部分。不过,你的想法是对的。只需确保在解析原始syslog消息以提取时间戳、严重性等信息之后有该过滤器。你会想要这样的东西:

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

由于您拾取的消息可能不是所有的都是JSON消息,因此您可能希望JSON过滤器周围有一个条件。或者,尝试对所有消息进行JSON解析,但删除过滤器为无法解析的消息添加的任何_jsonparsefailure标记。

谢谢-这是一个完美的答案。我只想为我的记忆添加一个链接
filter {
  grok {
    match => [...]
    # Allow replacement of the original message field
    overwrite => ["message"]
  }
  date {
    ...
  }
  json {
    source => "message"
  }
}