【问题标题】:split json on logstash udp input在logstash udp输入上拆分json
【发布时间】:2015-11-04 14:15:21
【问题描述】:

我们的一个应用程序通过 udp 以 JSON 格式将日志发送到远程服务器。 一些日志是链接的 JSON 字符串,如下所示:

{"s":1,"x":"foo"}{"s":1,"p":"bar"}

我正在使用以下过滤器来拆分消息。 当输入是文件时,日志会拆分,我会收到多个事件。 但是,当我使用 udp 输入时,它不会拆分字符串并仅从第一个 JSON 中创建单个事件。

filter {
    mutate {
       gsub => [ "message","}{","}#{"]
    }
    split {
       terminator => [ "#" ]
    }
    if [message] =~ /^{.*}$/  {
       json {
           source => message
       }
    }
}

有人知道这里出了什么问题吗?

【问题讨论】:

  • 你的“message”字段被logstash处理后是什么样子的?
  • 通过 udp 发送数据时,似乎在括号之间添加了“\u0000”,因此 gsub 函数没有做应该做的事情。此更新配置解决了这个问题 - filter { mutate { gsub => [ "message","}\u0000{","}#{"] } split { terminator => [ "#" ] } if [message] =~ /^{.*}$/ { json { 源 => 消息 } } }

标签: json udp logstash


【解决方案1】:

由于我的评论是在正确的道路上,我将它移到这里作为答案:

通过 stdout{} 输出函数检查 logstash 发送到 elasticsearch 的内容。如果您的字符与您的模式不匹配,则逻辑不会触发。

【讨论】:

    【解决方案2】:

    看起来,我也回复错了位置。 这就是解决它:

    当通过 udp 发送数据时,似乎在括号之间添加了“\u0000”,因此 gsub 函数没有按照我的意愿替换字符。 此更新配置解决了这个问题 -

    filter {
                  mutate {
                     gsub => [ "message","}\u0000{","}#{"] 
                  } 
                  split { 
                     terminator => [ "#" ] 
                  } 
                  if [message] =~ /^{.*}$/ { 
                     json { source => message }
                  }
      }
    

    【讨论】:

      猜你喜欢
      • 2015-07-09
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多