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

之前采用的是通过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"
}
...略
  • 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。后来才注意到,是应为创建的索引后面带了日期部分:

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

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

"template": "nginx_req_log_wireless"
  • 1

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

"template": "nginx_req_log_wireless*"
  • 1

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

logstash的output配置中指定elasticsearch的template的更多相关文章

  1. ELK 学习笔记之 Logstash之output配置

    Logstash之output配置: 输出到file 配置conf: input{ file{ path => "/usr/local/logstash-5.6.1/bin/spark ...

  2. spring mvc: 可参数化的视图控制器(在配置中指定jsp文件)MultiActionController/SimpleUrlHandlerMapping/ParameterizableViewController

    spring mvc: 可参数化的视图控制器(在配置中指定jsp文件)MultiActionController/SimpleUrlHandlerMapping/ParameterizableView ...

  3. ELK(ElasticSearch+Logstash+Kibana)配置中的一些坑基于7.6版本

    三个组件都是采用Docker镜像安装,过程简单不做赘述,直接使用Docker官方镜像运行容器即可,注意三个组件版本必须一致. 运行容器时最好将三个组件的核心配置文件与主机做映射,方便直接在主机修改不用 ...

  4. 使用Logstash同步数据至Elasticsearch,Spring Boot中集成Elasticsearch实现搜索

    安装logstash.同步数据至ElasticSearch 为什么使用logstash来同步,CSDN上有一篇文章简要的分析了以下几种同步工具的优缺点:https://blog.csdn.net/la ...

  5. logstash收集的日志输出到elasticsearch中

    logstash收集的日志输出到elasticsearch中 一.需求 二.实现步骤 1.编写pipeline文件 1.`elasticsearch`配置参数解析: 2.可能会报的一个异常 2.准备测 ...

  6. elasticsearch安装与使用(6)-- Logstash安装与配置

    由于elasticsearch的search guard 不支持 elasticsearch的jdbc,所以如果安装了search guard认证插件之后,基本上jdbc就废了,所以我们需要用到log ...

  7. WPF:指定的命名连接在配置中找不到、非计划用于 EntityClient 提供程序或者无效的解决方法

    文/嶽永鹏 WPF 数据绑定中绑定到ENTITY,如果把数据文件做成一个类库,在UI文件中去应用它,可能遇到下面这种情况. 指定的命名连接在配置中找不到.非计划用于 EntityClient 提供程序 ...

  8. 指定的命名连接在配置中找不到、非计划用于 EntityClient 提供程序或者无效

    以下内容来自互联网 (1)web: 需要在客户端配置文件的中增加connectionString节点,此节点描述了EntityClient的连接信息. 例如: 在web.config的中增加conne ...

  9. elasticsearch mysql logstash 同步 简单配置【环境centos7 elasticsearch 6.0 mysql 5.7 logstash 6.0】

    插件:logstash-input-jdbc 安装插件logstash-input-jdbc 1.安装 gem   yum install gem 2.替换国内的镜像   gem sources -- ...

随机推荐

  1. MongoDB学习(查找文档和其他数据查找操作)

    理解Cursor对象和查询运算符 cursor对象 cursor对象相当于一个指针,可通过迭代它来访问MongdoDB数据库中的一组对象. 在使用 find() 方法查询时,返回的并非实际文档,而是一 ...

  2. web服务器负载均衡与集群基本概念二

    前面已经说过负载均衡的作用是在多个节点之间按照一定的策略(算法)分发网络或计算处理负载.负载均衡可以采用软件和硬件来实现.一般的框架结构可以参考下图.    后台的多个Web节点上面有相同的Web应用 ...

  3. servlet与jsp篇(一)$.ajax交互

    servlet其实是利用java类编写的服务器端应用程序,他的生命周期可以分为三个阶段:初始化阶段.运行阶段和消亡阶段; jsp页面实质上是一个HTML页面,但他包含了用户产生动态网页内容的java代 ...

  4. weblogic patch log显示

    如何在WebLogic 12.1.3 版本的 server log 中显示 opatch 的补丁信息? 打补丁  patch 23558563 之后. 需要在 JAVA_OPTIONS 中添加如下参数 ...

  5. Salesforce的对象关系

    对象关系 Salesforce中的对象关系和一般的关系数据库不同. 在关系数据库中对象间的关系是由主键.外键等加以定义.而在Salesforce中,对象之间的关系是由自定义字段来确定. 这么做的原因是 ...

  6. iOS----------use_frameworks!

    1.https://segmentfault.com/a/1190000007076865 2.https://www.jianshu.com/p/8269e4cac48f 3.https://www ...

  7. Kotlin 扩展——省略findViewById

    现在 Kotlin 安卓扩展插件能够提供与这些开源库功能相同的体验,不需要添加任何额外代码. import kotlinx.android.synthetic.main.activity_main.* ...

  8. 微信小程序(基本知识点)

    创建页面的两种方式:   1.通过创建文件夹的方式创建(.wxml/.wxss/.json/.js/)   2.在app.json的"pages": []中添加路径"pa ...

  9. python之list和tuple

    https://www.cnblogs.com/evablogs/p/6691743.html list和tuple区别: 相同:均为有序集合 异同:list可变,tuple一旦初始化则不可变 lis ...

  10. Python递归函数

    参考: https://pythonspot.com/recursion/ https://www.python-course.eu/recursive_functions.php 一.递归函数两大要 ...