我正在运行一个非常标准的elk服务器来解析我的python应用程序日志。我设置python在json中输出日志,并在字段' msg'中输入日志消息字符串。这对我来说非常好用,但有人昨晚不小心用日志直接传递给了消息字段。因为昨晚记录的第一个' msg'新的索引锯被解析为一个对象。现在所有格式正确的日志消息都被拒绝,错误包括:
"error"=>{"type"=>"mapper_parsing_exception", "reason"=>"object mapping for [msg] tried to parse field [msg] as object, but found a concrete value"}}}, :level=>:warn}
我了解1 elasticsearch无法处理同一字段中的对象和字符串。有谁知道设置字段类型的最佳方法?是否应该通过使用logstash过滤器,通过设置elasticsearch映射或两者来改变它们来完成?或者应该在python格式化程序中预处理日志以确保msg不能被解析为json?所有3个选项看起来都相对简单,但我真的不理解这些权衡。
有什么建议吗?
答案 0 :(得分:0)
指定mapping无疑是best practice。
指定“文本”或“关键字”类型不仅可以防止您看到的错误,而且还可以提高性能。
仅当您知道输入始终为json并且出于某种原因不希望将其解析为其成分时(例如,如果它非常稀疏而对性能不利),我才建议使用logstash json_encode filter 。