【发布时间】: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