背景
在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创建模板。
作者:bellengao
链接:https://www.jianshu.com/p/dc73ec69c9f7