我正在尝试将项目模板应用于我的 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,以确保不会丢失任何消息。