logstash的output配置中指定elasticsearch的template

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

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

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

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

于是,参考原先filebeat中使用的template,写了一个供logstash用的template,起名为nginx_req_log_wireless.json,部分片段如下:

    "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"
                  }
              ...

之后,在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"

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

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

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

"template": "nginx_req_log_wireless"

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

"template": "nginx_req_log_wireless*"

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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值