专栏首页腾讯云Elasticsearch Servicelogstash在Elasticsearch中创建的默认索引模板问题
原创

logstash在Elasticsearch中创建的默认索引模板问题

背景

在ELK架构中,使用logstash收集服务器中的日志并写入到Elasticsearch中,有时候需要对日志中的字段mapping进行特殊的设置,此时可以通过自定义模板template解决,但是因为logstash默认会向Elasticsearch提交一个名为logstash的模板,所以在定义logstash配置文件时有一些关键点需要注意。本文基于logstash-5.6.4和elastcisearch-5.6.4对需要注意的关键点进行列举。

logstash的默认模板

默认的logstash模板:

{
  "order": 0,
  "version": 50001,
  "template": "logstash-*",
  "settings": {
    "index": {
      "refresh_interval": "5s"
    }
  },
  "mappings": {
    "_default_": {
      "_all": {
        "enabled": true,
        "norms": false
      },
      "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",
          "include_in_all": false
        },
        "@version": {
          "type": "keyword",
          "include_in_all": false
        },
        "geoip": {
          "dynamic": true,
          "properties": {
            "ip": {
              "type": "ip"
            },
            "location": {
              "type": "geo_point"
            },
            "latitude": {
              "type": "half_float"
            },
            "longitude": {
              "type": "half_float"
            }
          }
        }
      }
    }
  },
  "aliases": {}
}

使用logstash默认模板创建索引

使用logstash收集日志时, 如果对日志中的字段mapping没有特殊的要求,使用以下的logstash 配置文件1.conf就可以满足需求:

1.conf:

input {
    file {
        path => "/var/log/nginx/access.log" # nginx 访问日志的路径
        start_position => "beginning" # 从文件起始位置读取日志,如果不设置则在文件有写入时才读取,类似于tail -f
        }
}
filter {
}
output {
    elasticsearch {
    	hosts => ["http://172.16.0.145:9200"] # Elasticsearch集群的地址和端口
 }
}

上述配置实现收集nginx的访问日志并写入到Elasticsearch集群中去,这种情况下logstash会向Elasticsearch创建一个名为logstash-*的按天创建的index以及名为logstash的template,之后每天创建一个logstash-%{+YYYY.MM.dd}的index用于存储日志。

这种情况下,logstash-%{+YYYY.MM.dd}索引就会有两个type, 一个是defalut, 一个是logs.

不使用logstash默认模板创建索引

如果不想使用logstash默认创建的模板创建索引,有两种解决方式,一是可以在logstash配置文件中的output中指定index索引名称, 如2.conf所示:

2.conf:

input {
    file {
        path => "/var/log/nginx/access.log" # nginx 访问日志的路径
        start_position => "beginning" # 从文件起始位置读取日志,如果不设置则在文件有写入时才读取,类似于tail -f
        }
}
filter {
}
output {
    elasticsearch {
    	hosts => ["http://172.16.0.145:9200"] # Elasticsearch集群的地址和端口
    	index => "nginx_access-%{+YYYY.MM.dd}"
 }
}

使用2.conf, logstash会向Elasticsearch提交创建一个名为"nginx_access-%{+YYYY.MM.dd}"的索引,并且只有一个名为“logs”的type.

第二种解决方式是在output中指定manage_template=>false,如3.conf所示:

3.conf

input {
    file {
        path => "/var/log/nginx/access.log" # nginx 访问日志的路径
        start_position => "beginning" # 从文件起始位置读取日志,如果不设置则在文件有写入时才读取,类似于tail -f
        }
}
filter {
}
output {
    elasticsearch {
    	hosts => ["http://172.16.0.145:9200"] # Elasticsearch集群的地址和端口
    	manage_template=>false
 }
}

使用3.conf配置,logstash会向Elasticsearch提交创建一个名为"logstash-%{+YYYY.MM.dd}"的索引,并且只有一个名为“logs”的type. 注意此时logstash将不会提交创建名为logstash的模板。

索引的type问题

默认情况下,logstash向Elasticsearch提交创建的索引的type为"logs",如果需要自定义type, 有两种方式,一种是在output里指定document_type参数,另一种是在input里指定type参数, output里的document_type优先级大于input里的type.

使用自定义模板

使用自定义模板有两种方式,一种是启动logstash之前先调用Elasticsearch的API创建模板,并指定模板匹配的索引名称pattern以及模板优先级,具体可参考官方文档 https://www.elastic.co/guide/en/elasticsearch/reference/6.3/indices-templates.html;另一种方式是在logstash端的output中增加"template"和"template_name"参数,如4.conf所示。

4.conf

input {
    file {
        path => "/var/log/nginx/access.log" # nginx 访问日志的路径
        start_position => "beginning" # 从文件起始位置读取日志,如果不设置则在文件有写入时才读取,类似于tail -f
        }
}
filter {
}
output {
    elasticsearch {
    	hosts => ["http://172.16.0.145:9200"] # Elasticsearch集群的地址和端口
    	template => "/path/to/mytemplate.json"
    	"template_name" => "nginx_access"
 }
}

上述配置需要先在/path/to路径下存放一个json格式的模板配置文件,template_name如果不指定的话,会使用默认值logstash. 注意此种情况不能在output设置manage_template参数为false, 否则logstash将不会调用Elasticsearch API创建模板。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用filebeat收集ES集群运行日志和慢日志并写入到ES

    Elasticsearch集群运行过程中,运行日志和慢日志能够帮助集群使用者迅速定位出现的问题。

    bellen
  • logstash input插件开发

    logstash作为一个数据管道中间件,支持对各种类型数据的采集与转换,并将数据发送到各种类型的存储库,比如实现消费kafka数据并且写入到Elasticsea...

    bellen
  • Elasticsearch:执行同样的查询语句多次结果不一致?!

    最近有用户让帮忙看一下一个诡异的问题,同样的一个查询语句,执行多次查询结果竟然不一致,查询结果中hits.total一会是30,一会为15,这是为什么呢?

    bellen
  • Istio 1.5部署,回归单体

    Istio 架构又换了,从 1.5 开始,把控制平面的所有组件组合并成一个单体结构叫 istiod,对于运维部署来说省去很大麻烦。Mixer 组件被移除,新版本...

    YP小站
  • 微服务重要的容器技术Docker的核心实现技术

    Docker 作为一种容器虚拟化技术,应用了操作系统的多项底层支持技术。其中的技术层包含Linux操作系统的命名空间Namespace,控制组,联合文件系统,...

    用户2196435
  • python接口自动化34-json校验神器jsonschema

    前面一篇讲到json解析神器jsonpath, jsonpath是为了方便快速取值,如果我们要校验json的字段类型和格式,就不是那边方便了。 比如当接口返回一...

    上海-悠悠
  • 和开发同学讨论的一个技术问题(r8笔记第73天)

    今天下午的时候,有一位开发同事找我,说有一个技术问题想请教一下。 当然正如他所说,这个问题比较奇怪,而且已经影响了他的测试流程,他说有一个表查看对应的表空...

    jeanron100
  • 6-51单片机WIFI学习(测试TCP服务器--使用串口调试助手--不连接路由器)

    上一篇连接  http://www.cnblogs.com/yangfengwu/p/8757513.html 注意:更加详细的操作请参考, http://ww...

    杨奉武
  • 【BDTC 2017讲师专访】彭冬:微博商业基础大数据平台(D+)的架构演进

    BDTC 2017中国大数据技术大会将于12月7日-9日在北京新云南皇冠假日酒店举行,大会为期三天。届时,近百位技术专家将为现场数千名的大数据行业精英、技术...

    CSDN技术头条
  • php上传文件完整源码表单

    在下面这个脚本中,我们增加了对文件上传的限制。用户只能上传 .gif、.jpeg、.jpg、.png 文件,文件大小必须小于 200 kB:

    用户5706463

扫码关注云+社区

领取腾讯云代金券