设为首页 收藏本站
查看: 1892|回复: 0

[经验分享] 修改elasticsearch映射模板——替换默认的logstash映射模板为nginx开头的模板

[复制链接]

尚未签到

发表于 2019-1-29 11:48:29 | 显示全部楼层 |阅读模式
  相信很多探索ELK的朋友和我一样,总是想把nginx访问日志的索引名称修改为自己想要的名称模式,
  例如:nginx-access-YY.MM.DD,不相信使用默认的必须以logstash-开头的,但是就这一个更改却
  可能带来很多的问题,比较常见的是自定义的映射模板导入失败,参数不生效,geoip的定位信息无法
  在kibana中调用,笔者也是吃尽了苦头,查阅了很多的技术博客,理解了模板映射的原理后,反复尝试
  才成功使用上了自定义的模板映射文件。不知道很多前辈是踩过坑都不说还是之前的版本有新版有区别,
  反正没有看到对此问题说的特别清晰的文章,所以笔者吃尽苦头之后,还是把自己的心路历程写出来,
  希望对后人有所帮助。
  cat /usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-elasticsearch-9.2.0-java/lib/logstash/outputs/elasticsearch/elasticsearch-template-es7x.json
  {
  "template" : "logstash-*",
  "version" : 60001,
  "settings" : {
  "index.refresh_interval" : "5s",
  "number_of_shards": 1
  },
  "mappings" : {
  "_doc" : {
  "dynamic_templates" : [ {
  "message_field" : {
  "path_match" : "message",
  "match_mapping_type" : "string",
  "mapping" : {
  "type" : "text",
  "norms" : false
  }
  }
  }, {
  "string_fields" : {
  "match" : "*",
  "match_mapping_type" : "string",
  "mapping" : {
  "type" : "text", "norms" : false,
  "fields" : {
  "keyword" : { "type": "keyword", "ignore_above": 256 }
  }
  }
  }
  } ],
  "properties" : {
  "@timestamp": { "type": "date"},
  "@version": { "type": "keyword"},
  "geoip"  : {
  "dynamic": true,
  "properties" : {
  "ip": { "type": "ip" },
  "location" : { "type" : "geo_point" },
  "latitude" : { "type" : "half_float" },
  "longitude" : { "type" : "half_float" }
  }
  }
  }
  }
  }
  }
  如何直接复制以上内容,修改索引名称后使用kibana提供的ES的控制台导入会报如下错误:
  #! Deprecation: Deprecated field [template] used, replaced by [index_patterns]
  {
  "acknowledged": true
  }
  可以导入成功,那是因为ES会自我修正,把"template" : "nginx-*"修改为
  "index_patterns" : ["nginx-*"]
  所以正确的自定义义映射模板文件内容应该如下:
  {
  "index_patterns" : ["nginx-*"],
  "version" : 60001,
  "settings" : {
  "index.refresh_interval" : "5s",
  "number_of_shards": 1
  },
  "mappings" : {
  "_doc" : {
  "dynamic_templates" : [ {
  "message_field" : {
  "path_match" : "message",
  "match_mapping_type" : "string",
  "mapping" : {
  "type" : "text",
  "norms" : false
  }
  }
  }, {
  "string_fields" : {
  "match" : "*",
  "match_mapping_type" : "string",
  "mapping" : {
  "type" : "text", "norms" : false,
  "fields" : {
  "keyword" : { "type": "keyword", "ignore_above": 2048 }
  }
  }
  }
  } ],
  "properties" : {
  "@timestamp": { "type": "date"},
  "@version": { "type": "keyword"},
  "geoip"  : {
  "dynamic": true,
  "properties" : {
  "ip": { "type": "ip" },
  "location" : { "type" : "geo_point" },
  "latitude" : { "type" : "half_float" },
  "longitude" : { "type" : "half_float" }
  }
  }
  }
  }
  }
  }
  如果你是第一时间就使用这种方法,笔者只能说你非常走运,可能两步就能摆平这个自定义映射模板的问题。
  但我相信很多人的遭遇和笔者一样,走了很多的弯路,笔者当时就一直想使用logstash来自己管理这个映射
  模板文件,但经过笔者多次尝试,如果直接使用curl 127.0.0.1:9200/_template/logstash?pretty导出
  并重定向到一个文件,再修改的话就遇上大坑了。
  curl 127.0.0.1:9200/_template/logstash?pretty > nginx.json
  vim nginx.json
  {
  "nginx" : {
  "order" : 0,
  "version" : 60001,
  "index_patterns" : [
  "nginx-*"
  ],
  "settings" : {
  "index" : {
  "refresh_interval" : "5s"
  }
  },
  "mappings" : {
  "_default_" : {
  "dynamic_templates" : [
  {
  "message_field" : {
  "path_match" : "message",
  "match_mapping_type" : "string",
  "mapping" : {
  "type" : "text",
  "norms" : false
  }
  }
  },
  {
  "string_fields" : {
  "match" : "*",
  "match_mapping_type" : "string",
  "mapping" : {
  "type" : "text",
  "norms" : false,
  "fields" : {
  "keyword" : {
  "type" : "keyword",
  "ignore_above" : 1024
  }
  }
  }
  }
  }
  ],
  "properties" : {
  "@timestamp" : {
  "type" : "date"
  },
  "@version" : {
  "type" : "keyword"
  },
  "geoip" : {
  "dynamic" : true,
  "properties" : {
  "ip" : {
  "type" : "ip"
  },
  "location" : {
  "type" : "geo_point"
  },
  "latitude" : {
  "type" : "half_float"
  },
  "longitude" : {
  "type" : "half_float"
  }
  }
  }
  }
  }
  },
  "aliases" : { }
  }
  }
  此时在logstash的配置文件中使用如下配置,启动logstash后,可以看到logstash会报错
  elasticsearch {
  hosts => ["192.168.10.101:9200"]
  index => "nginx-%{+YYYY.MM.dd}"
  template => "/etc/logstash/nginx.json"
  template_name => "nginx"
  template_overwrite => true
  }
  logstash日志报错如下:
  [2018-09-17T04:43:46,342][INFO ][logstash.outputs.elasticsearch] Installing elasticsearch template to _template/nginx
  [2018-09-17T04:43:46,504][ERROR][logstash.outputs.elasticsearch] Failed to install template. {:message=>"Got response code '400' contacting Elasticsearch at
  URL 'http://192.168.10.101:9200/_template/nginx'", :class=>"LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError", :backtrace=>["/usr/shar
  e/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-elasticsearch-9.2.0-java/lib/logstash/outputs/elasticsearch/http_client/manticore_adapter.rb:80:in
  `perform_request'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-elasticsearch-9.2.0-java/lib/logstash/outputs/elasticsearch/http_clie
  nt/pool.rb:291:in `perform_request_to_url'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-elasticsearch-9.2.0-java/lib/logstash/output
  s/elasticsearch/http_client/pool.rb:278:in `block in perform_request'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-elasticsearch-9.2
  .0-java/lib/logstash/outputs/elasticsearch/http_client/pool.rb:373:in `with_connection'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output
  -elasticsearch-9.2.0-java/lib/logstash/outputs/elasticsearch/http_client/pool.rb:277:in `perform_request'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/ge
  ms/logstash-output-elasticsearch-9.2.0-java/lib/logstash/outputs/elasticsearch/http_client/pool.rb:285:in `block in Pool'", "/usr/share/logstash/vendor/bundl
  e/jruby/2.3.0/gems/logstash-output-elasticsearch-9.2.0-java/lib/logstash/outputs/elasticsearch/http_client.rb:348:in `template_put'", "/usr/share/logstash/ve
  ndor/bundle/jruby/2.3.0/gems/logstash-output-elasticsearch-9.2.0-java/lib/logstash/outputs/elasticsearch/http_client.rb:86:in `template_install'", "/usr/shar
  e/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-elasticsearch-9.2.0-java/lib/logstash/outputs/elasticsearch/template_manager.rb:21:in `install'", "
  /usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-elasticsearch-9.2.0-java/lib/logstash/outputs/elasticsearch/template_manager.rb:9:in `inst
  all_template'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-elasticsearch-9.2.0-java/lib/logstash/outputs/elasticsearch/common.rb:118
  :in `install_template'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-elasticsearch-9.2.0-java/lib/logstash/outputs/elasticsearch/comm
  on.rb:49:in `block in install_template_after_successful_connection'"]}
  如果复制nginx.json的文件内容直接在kibana的ES控制台上导入的话,会直接看到报错提示
  PUT _template/nginx-test
  {
  "nginx" : {
  "order" : 0,
  "version" : 60001,
  "index_patterns" : [
  "nginx-*"
  ],
  "settings" : {
  "index" : {
  "refresh_interval" : "5s"
  }
  },
  "mappings" : {
  "_default_" : {
  "dynamic_templates" : [
  {
  "message_field" : {
  "path_match" : "message",
  "match_mapping_type" : "string",
  "mapping" : {
  "type" : "text",
  "norms" : false
  }
  }
  },
  {
  "string_fields" : {
  "match" : "*",
  "match_mapping_type" : "string",
  "mapping" : {
  "type" : "text",
  "norms" : false,
  "fields" : {
  "keyword" : {
  "type" : "keyword",
  "ignore_above" : 1024
  }
  }
  }
  }
  }
  ],
  "properties" : {
  "@timestamp" : {
  "type" : "date"
  },
  "@version" : {
  "type" : "keyword"
  },
  "geoip" : {
  "dynamic" : true,
  "properties" : {
  "ip" : {
  "type" : "ip"
  },
  "location" : {
  "type" : "geo_point"
  },
  "latitude" : {
  "type" : "half_float"
  },
  "longitude" : {
  "type" : "half_float"
  }
  }
  }
  }
  }
  },
  "aliases" : { }
  }
  }
  右边返回信息栏中报错如下:
  {
  "error": {
  "root_cause": [
  {
  "type": "action_request_validation_exception",
  "reason": "Validation Failed: 1: index patterns are missing;"
  }
  ],
  "type": "action_request_validation_exception",
  "reason": "Validation Failed: 1: index patterns are missing;"
  },
  "status": 400
  }
  当初笔者就是为此报错抓狂过,但最后算是绕了一个很大的圈子找到了第一种方式的文件模板,最后才成功实现
  给nginx自定义映射模板。所以,如果正在抓狂的你看到了我的这篇文章,是不是有一种雪中送炭的感觉了!,
  如果感觉有,请点赞+转发!




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-669142-1-1.html 上篇帖子: 实时的分布式搜索和分析引擎——Elasticsearch 下篇帖子: Elasticsearch重启前禁止分片移动的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表