【问题标题】:Elasticsearch, never parse field as objectElasticsearch,从不将字段解析为对象
【发布时间】:2018-07-31 08:13:35
【问题描述】:

我正在运行一个非常标准的 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 个选项似乎都比较简单,但我真的不明白其中的取舍。

有什么建议吗?

【问题讨论】:

  • 由于您还没有得到答案,我很想知道您是否确定了任何特定的方法?
  • 我一直在我的 python 格式化程序中进行预处理,因为我知道这是可行的。我尝试将我的映射设置为始终将某些字段视为字符串,但是当 logstash 建立新索引时,我无法让 elasticsearch 正确拾取我的模板。

标签: elasticsearch elastic-stack


【解决方案1】:

指定mapping 绝对是best practice

指定“文本”或“关键字”类型不仅可以防止您看到的错误,还会对性能产生其他有益影响。

我会推荐logstash json_encode filter,前提是您知道输入始终是 json 并且出于某种原因不希望将其解析为其组成部分(例如,如果它非常稀疏,这将不利于性能)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-28
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多