【问题标题】:Logstash remove field after JSON-parsing itJSON解析后Logstash删除字段
【发布时间】:2015-03-12 04:29:30
【问题描述】:

在 Ubuntu 14.04 LTS 上使用 Logstash 1.4.2 和 ElasticSearch 1.3(我知道它不是可用的最新 ES 版本)。

我们有一个事件流,其中包含一个名为“消息”的字段中的 JSON。

如果找到,我们想用该字段的 JSON 替换事件字段。

如果找到并解析,我们还想删除原始“消息”字段(包含 JSON 字符串的字段)。

问题是字段文本中的 JSON 对象可以定义一个新的“消息”字段,我们必须保留它。

解析后总是删除“消息”字段:

json {
  source => "message"
  remove_field => [ "message" ]
}

这是错误的,我们想保留它,以防原始“消息”字段的值中有一个“消息”字段。

我尝试了以下技巧,但似乎仍然从结果中删除了“消息”字段:

mutate {
  rename => [ "message", "___temp_logstash_filter_message___" ]
}
json {
  source => "___temp_logstash_filter_message___"
}
mutate {
  remove_field => [ "___temp_logstash_filter_message___" ]
}

即我尝试将原始“消息”字段重命名为我不希望出现在输入值中的任意内部名称,使用该临时名称作为源解析 JSON 字符串,然后删除重命名的原始字段。

这样,我希望区分“原始”消息字段和可能包含在其 JSON 值中的任何“消息”字段。但这似乎没有什么不同——结果中仍然缺少“消息”字段。

有没有办法实现我的需要?

谢谢。

【问题讨论】:

  • 尝试将原始 mutate{} 放入单独的 filter{} 块中。我发现这有时有助于字段范围。
  • 另外,将 remove_field 放在 json{} 块中,这样只有成功时才会删除 temp 字段。
  • 感谢您的提示。移动第一个 mutate{} 可能是个问题,因为所有这些都是在条件块内完成的。关于第二个 mutate{} - 我将其明确放在单独的节中以使逻辑更具可读性,但我也会尝试您所说的。顺便说一句 - temp_logstash_fileter_message 字段没有出现在输出中,所以我认为这部分不是问题。

标签: json elasticsearch logstash


【解决方案1】:

不要重命名字段,而是将第一个字段复制到新字段中。

这可以通过:

filter {
    ...
    ruby {
        code => "event['new_field'] = event['old_field']"
    }
    ...
}

【讨论】:

  • 谢谢。在JSON解析之后我仍然需要找出是否应该删除消息字段。也许通过使用 Ruby 重命名它或将预解析与该字段的解析后版本进行比较,我将能够实现这一目标?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
相关资源
最近更新 更多