logstash的output配置中指定elasticsearch的template

 转自:https://blog.csdn.net/felix_yujing/article/details/78930389

以前采用的是经过filebeat收集nginx的日志,直接到elasticsearch。filebeat带有nginx的module模块,经过这个nginx模块实现filebeat对nginx日志中字段的处理。最近因为一些实际的使用场景和需求,对nginx日志的收集和处理方式作了一下调整:php

filebeat收集nginx原始日志信息到kafka,而后logstash再从kafka读取日志,并进行字段处理后送到elasticsearch集群。即相比原来的方式,添加了kafka层。nginx

logstash从kafka读取过来的日志为json格式,字段的解析能够借助Grok Debugger工具来调,具体的解析方式这里就不细说了。这里主要说一下在logstash使用elasticsearch的template进行字段类型mapping的时候,须要注意的一点问题。json

logstash将日志里的字段解析出来并发送到elasticsearch后,发现es上字段的默认的类型都是text的。若是对一些关键字须要作统计报表的时候,就会出现提示报错。如,我用grafana将elasticsearch作为数据源进行数据展现时遇到以下报错: 
这里写图片描述 
有报错提示能够看出,将nginx.access.remote_ip的字段换成keyword类型能够解决。bash

因而,参考原先filebeat中使用的template,写了一个供logstash用的template,起名为nginx_req_log_wireless.json,部分片断以下:markdown

"template": "nginx_req_log_wireless", "settings": { "index.refresh_interval": "5s" }, "mappings": { ...略 "nginx": { "properties": { "access": { "properties": { "referrer": { "ignore_above": 1024, "type": "keyword" }, "agent": { "norms": false, "type": "text" }, "response_code": { "type": "long" }, "geoip": { "properties": { "continent_name": { "ignore_above": 1024, "type": "keyword" }, "city_name": { "ignore_above": 1024, "type": "keyword" }, "country_name": { "ignore_above": 1024, "type": "keyword" }, "region_name": { "ignore_above": 1024, "type": "keyword" }, "location": { "type": "geo_point" } } }, "remote_ip": { "ignore_above": 1024, "type": "keyword" }, "method": { "ignore_above": 1024, "type": "keyword" }, "user_name": { "ignore_above": 1024, "type": "keyword" }, "http_version": { "ignore_above": 1024, "type": "keyword" }, "body_sent": { "properties": { "bytes": { "type": "long" } } }, "url": { "ignore_above": 1024, "type": "keyword" } ...略
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72

以后,在logstash的output里的elasticsearch配置部分对template模板进行指定:并发

index => "nginx_req_log_wireless-%{+YYYY.MM.dd}" manage_template => true template_name => "nginx_req_log_wireless" template_overwrite => true template => "/usr/local/logstash-5.4.3/template/nginx_req_log_wireless.json"
  • 1
  • 2
  • 3
  • 4
  • 5

调试后发现,elasticsearch上建立的索引中字段的类型,并无按照指定的template去mapping。后来才注意到,是应为建立的索引后面带了日期部分:app

index => "nginx_req_log_wireless-%{+YYYY.MM.dd}"
  • 1

这致使跟nginx_req_log_wireless.json模板文件中指定的template名并不匹配形成的:less

"template": "nginx_req_log_wireless"
  • 1

解决办法,就是将template名末尾加一个*号通配符便可:elasticsearch

"template": "nginx_req_log_wireless*"
  • 1

总结一下: 
index的名字必需要和指定的json文件中的templete名相匹配,定义的mapping才会生效。logstash的output配置的template_name名能够随便。 
这里写图片描述工具

相关文章
相关标签/搜索