將項目模板應用於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 的字元串欄位都不會被索引。
但情況似乎並非如此。即使在手動旋轉活動寫入索引之後,我仍然會遇到相同的錯誤。我什至重新啟動了 VM,並旋轉了活動寫入索引 - 沒有任何效果。
任何人都可以看到我的模板有明顯的錯誤嗎?具體來說,我不確定 _all 部分是否應該在那裡。
我用這個命令來添加它:
curl -XPUT 'localhost:9200/_template/loggingtemplate?pretty' -H 'Content-Type: application/json' -d'<template here'
並且這個命令用來驗證它是否已經被添加。
curl -XGET localhost:9200/_template/loggingtemplate
由於某種原因,我的動態映射沒有得到尊重。
相反,為了解決這個問題,我必須為我的所有索引集創建一個自定義索引映射。在我看來,這是一個骯髒的解決方案,因為我現在必須複製粘貼所有索引集的配置。忘記一個將導致索引錯誤和消息失去 - 以防我們的日誌消息的結構在未來發生變化。
詳細資訊在這裡: 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,以確保不會失去任何消息。