我有一个项目,用于分析和可视化访问日志数据。我使用Logstash将数据发送到Elasticsearch,然后使用Kibana可视化一些东西。
一切工作正常,直到我发现需要路径层次分析器来显示我想要的东西。现在,我有了一个自定义模板(JSON),并更改了Logstash配置的out部分。但是,当我为数据建立索引时,不会应用我的模板。
(Elasticseach和Logstash的5.2版无法更新,因为这是我工作的地方正在使用的版本)。
我的JSON文件有效。就输入和过滤器而言,我的Logstash配置也很好。我想我在输出中犯了一个错误。
我已经尝试将manage_template设置为false。我也尝试过template_overwrite =>“ false”。
我尝试首先创建索引(Kibana Dev Tools),然后填充它。我创建了索引模板,然后创建了索引。这样就可以应用我的模板,并且当我创建索引模式时,一切似乎都正确。然后,我索引了一个日志文件。我最终遇到了信使提取错误。 http://localhost:9200/_all/_mapping?pretty=1向我显示,在索引数据时,使用的是默认模板,而不是自定义模板。与添加自定义模板之前没有什么不同。
我在网上搜索并阅读了我在stackoverflow和弹性论坛中可以找到的有关未应用自定义模板的所有信息。我尝试了那里提供的所有解决方案,这就是为什么我最终选择了本地保存的自定义模板,并在logstash输出中提供路径的原因。但是我现在全都没主意了。
这是我的logstash配置的输出:
output {
elasticsearch {
hosts => ["localhost:9200"]
template => "/etc/logstash/conf.d/template.json"
index => "beam-%{+YYYY.MM.dd}"
manage_template => "true"
template_overwrite => "true"
document_type => "beamlogs"
}
stdout {
codec => rubydebug
}
}
这是我的自定义模板:
{
"template": "beam_custom",
"index_patterns": "beam-*",
"order" : 5,
"settings": {
"number_of_shards": 1,
"analysis": {
"analyzer": {
"custom_path_tree": {
"tokenizer": "custom_hierarchy"
},
"custom_path_tree_reversed": {
"tokenizer": "custom_hierarchy_reversed"
}
},
"tokenizer": {
"custom_hierarchy": {
"type": "path_hierarchy",
"delimiter": "/"
},
"custom_hierarchy_reversed": {
"type": "path_hierarchy",
"delimiter": "/",
"reverse": "true"
}
}
}
},
"mappings": {
"beamlogs": {
"properties": {
"object": {
"type": "text",
"fields": {
"tree": {
"type": "text",
"analyzer": "custom_path_tree"
},
"tree_reversed": {
"type": "text",
"analyzer": "custom_path_tree_reversed"
}
}
},
"referral": {
"type": "text",
"fields": {
"tree": {
"type": "text",
"analyzer": "custom_path_tree"
},
"tree_reversed": {
"type": "text",
"analyzer": "custom_path_tree_reversed"
}
}
},
"@timestamp" : {
"type" : "date"
},
"action" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
},
"datetime" : {
"type" : "date",
"format": "time_no_millis",
"fields" : {
"keyword" : {
"type": "keyword"
}
}
},
"id" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
},
"info" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
},
"message" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
},
"page" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
},
"path" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
},
"result" : {
"type" : "long"
},
"s_direct" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
},
"s_limit" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
},
"s_mobile" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
},
"s_terms" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
},
"size" : {
"type" : "long"
},
"sort" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
}
}
}
}
}
将数据编入索引后,这就是我从http://localhost:9200/_all/_mapping?pretty=1获得的内容
"datetime" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"object" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
datetime不应具有文本类型。但更糟糕的是,甚至没有创建objet.tree之类的字段。
我真的不关心日期时间的错误映射,但是我需要使Path Hierarchy Analyzer起作用。我就是不知道该怎么办。
所以。我刚刚尝试的是在Kibana中创建索引模板。
PUT _template/beam_custom
/followed by what is in my template.json
然后我检查模板是否已创建。
GET _template/beam_custom
输出为:
{
"beam_custom": {
"order": 100,
"template": "beam_custom",
"settings": {
"index": {
"analysis": {
"analyzer": {
"custom_path_tree_reversed": {
"tokenizer": "custom_hierarchy_reversed"
},
"custom_path_tree": {
"tokenizer": "custom_hierarchy"
}
},
"tokenizer": {
"custom_hierarchy": {
"type": "path_hierarchy",
"delimiter": "/"
},
...
所以我想创建模板是可行的。
然后我创建了一个索引
PUT beam-2019-07-15
但是当我检查索引时,我得到了:
{
"beam-2019.07.15": {
"aliases": {},
"mappings": {},
"settings": {
"index": {
"creation_date": "1563044670605",
"number_of_shards": "5",
"number_of_replicas": "1",
"uuid": "rGzplctSQDmrI_NSlt47hQ",
"version": {
"created": "5061699"
},
"provided_name": "beam-2019.07.15"
}
}
}
}
是否应该识别索引模式?我认为这是问题的核心。我以为可以使用我的模板,而输出应该是这样的:
{
"beam-2019.07.15": {
"aliases": {},
"mappings": {
"logs": {
"properties": {
"@timestamp": {
"type": "date"
},
"action": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},...
为什么无法识别模式?
答案 0 :(得分:1)
所以,我发现了错误。
当我查找如何构建自己的模板时,有时会查看当前版本的文档。但是在5.2中,“ index_patterns =>”不存在。
"template": "beam_custom",
"index_patterns": "beam-*",
那当然不起作用。
相反,我放下了“ index_patterns”行,并在模板参数中定义了我的模式。
"template": ["beam-*"],
//rest
这解决了问题。之后,我的模式被识别。
但是,我现在面临另一个问题。路径层次分析器无法正常工作。没有创建object.tree和我想要的其余字段。
GET beam-*/_search
{
"query": {
"term": {
"object.tree": "/belletristik/"
}
}
}
什么也没产生,尽管我应该有几百次点击。查看我的数据,我的路径没有分析的字段。有什么想法吗?