将项目模板应用于 elasticsearch

将项目模板应用于 elasticsearch

我正在尝试将项目模板应用于我的 elasticsearch 集群,以解决字段内容超过 32kb 的问题。我使用的是 2.4.4 版本,因为这是 graylog 中支持的最高版本。

看:https://github.com/Graylog2/graylog2-server/issues/873

具体解决方案在这里:https://github.com/Graylog2/graylog2-server/issues/873#issuecomment-199898314

我还遇到了另一个问题,我正在尝试使用项目模板进行修复。其中一个字段可以包含数字或字符串。但由于 elasticsearch 根据字段中值的首次出现来映射字段,因此有时会在活动索引上给我一个 MapperParsingException。

根据链接的 github 问题中建议的解决方案,我制作了自己的项目模板,并在 elasticsearch 文档的支持下添加了一个动态模板。

结果如下:

{
    "template": "graylog*",
    "mappings": {
        "_default_": {
            "_all": {
                "enabled": false
            },
            "dynamic_templates": [{
                "entityid_as_string": {
                    "match": "EntityId",
                    "mapping": {
                        "type": "string"
                    }
                }
            },
            {
                "notanalyzed_string": {
                    "match_mapping_type": "string",
                    "mapping": {
                        "ignore_above": 32766,
                        "type": "string",
                        "doc_values": true
                    }
                }
            }]
        }
    }
}

我期望的行为是,EntityId 字段将始终映射为字符串。并且文档中任何内容超过 32kb 的字符串字段都不会被索引。

但事实似乎并非如此。即使手动旋转活动写入索引后,我仍然会收到相同的错误。我甚至重新启动了虚拟机,并旋转了活动写入索引 - 没有任何效果。

有人能看出我的模板中有一个明显的错误吗?具体来说,我不确定 _all 部分是否应该在那里。

我使用这个命令来添加它:

curl -XPUT 'localhost:9200/_template/loggingtemplate?pretty' -H 'Content-Type: application/json' -d'<template here'

并使用此命令来验证它已被添加。

curl -XGET localhost:9200/_template/loggingtemplate

答案1

由于某种原因,我的动态映射没有得到尊重。

相反,为了解决这个问题,我不得不为所有索引集创建自定义索引映射。在我看来,这是一个肮脏的解决方案,因为我现在必须复制粘贴所有索引集的配置。忘记一个会导致索引错误,并导致消息丢失——以防我们的日志消息的结构在未来发生变化。

详细信息请参见此处: http://docs.graylog.org/en/2.2/pages/configuration/elasticsearch.html#custom-index-mappings

这是我为索引集创建的映射。在具体示例中,我将其应用于名为“application_logs”的索引集。

{
    "template": "application_logs_*",
    "mappings": {
        "message": {
            "properties": {
                "Message": {
                    "type": "string",
                    "ignore_above": 32766
                },
                "EventEntities": {
                    "type": "string",
                    "ignore_above": 32766
                },
                "Severity": {
                    "type": "string"
                },
                "EntityId": {
                    "type": "string"
                }
            }
        }
    }
}

要将其添加到 elasticsearch,我将使用以下命令。

curl -XPUT 'localhost:9200/_template/logs_fields_as_strings?pretty' -H 'Content-Type: application/json' -d'{"template": "application_logs_*","mappings" : {"message" : {"properties" : {"Message" : {"type" : "string","ignore_above" : 32766},"EventEntities" : {"type" : "string","ignore_above": 32766},"Severity" : {"type" : "string"},"EntityId" : {"type" : "string"}}}}}'

这将创建一个名为“logs_fields_as_strings”的模板。

对于我们拥有的每个索引集,我都需要修改模板名称和模板的目标。

如果要对字段进行索引,则数字 32766 是该字段可以包含的最大字节数。请记住,某些 UTF8 字符是 3 个字节。因此,如果您希望在消息中包含这些字符,则需要将 32766 除以 3,以确保不会丢失任何消息。

相关内容