目录
  - 前言
  - 多配置文件的实现方式
  - 为logstash 增加模板
  - 将 logstash 作为服务启动

1. 前言

在使用 logstash 编写多个配置文件,写入到 elasticsearch 时,会出现数据写入混乱的问题,举例来说:

多个配置文件中规则如下:

A -> es-logstash-A
B -> es-logstash-B A 写入到 es-logstash-A 索引中
B 写入到 es-logstash-B 索引中

然而当 logstash 服务运行起来的时候并不是这样的,可能出现如下想象:

A-> es-logstash-A
B-> es-logstash-A

究其原因,是因为 logstash 运行起来的时候,会将所有的配置文件合并执行。因此,每个 input 的数据都必须有一个唯一的标识,在 filter 和 output 时,通过这个唯一标识来实现过滤或者存储到不同的索引。

2. 多配置文件的实现方式

如上所说,写入需要唯一标识,在logstash 中唯一标识推荐使用 type 或 tags 字段,然后通过 if 条件判断来实现。

首先来看下面一个示例:

在 /etc/logstash/conf.d 目录下有这样两个配置文件 [1.conf   a.conf ]

[root@192.168.118.14 /etc/logstash/conf.d]#ls
1.conf a.conf 1.conf
input {
file {
path => "/data/log/1.log"
start_position => "beginning"
sincedb_path => "/tmp/1_progress"
}
} output {
elasticsearch {
hosts => ["192.168.118.14"]
index => "1-log-%{+YYYY.MM.dd}"
}
} a.conf
input {
file {
path => "/data/log/a.log"
start_position => "beginning"
sincedb_path => "/tmp/a_progress"
}
} output {
elasticsearch {
hosts => ["192.168.118.14"]
index => "a-log-%{+YYYY.MM.dd}"
}
} /data/log/a.log
[root@192.168.118.14 ~]#cat /data/log/a.log
a /data/log/1.log
[root@192.168.118.14 ~]#cat /data/log/1.log
1

这两个配置很简单,规则:

  • 1.conf  读取 /data/log/1.log 写入到 1-log-[date] 索引
  • a.conf 读取 /data/log/a.log 写入到 a-log-[date] 索引

两个日志文件,都只有 1 行日志记录。

正确的结果是 生成两个索引,每个索引里只有一条记录。

接下来启动服务查看,多配置文件 命令启动方式如下:

正确的启动方式:

[root@192.168.118.14 ~]#logstash -f /etc/logstash/conf.d/

错误的启动方式:

[root@192.168.118.14 ~]#logstash -f /etc/logstash/conf.d/*

启动成功后,通过 elasticsearch-head 查看 索引及数据

发现每个 索引里却有 2 条记录,这不符合正常的逻辑,查看数据发现,每个索引里都是 1.log 和 a.log  的数据总和。

这也证明了 logstash 在写入数据的时候,是将所有的配置文件合并在一起的,运行起来数据写入就会混乱。要解决这种混乱就需要通过唯一标识和if 判断,logstash配置文件调整如下:

1.conf
input {
file {
path => "/data/log/1.log"
start_position => "beginning"
sincedb_path => "/tmp/1_progress"
type => "1-log"
}
} output {
if [type] == "1-log" {
elasticsearch {
hosts => ["192.168.118.14"]
index => "1-log-%{+YYYY.MM.dd}"
}
}
} a.conf
input {
file {
path => "/data/log/a.log"
start_position => "beginning"
sincedb_path => "/tmp/a_progress"
type => "a-log"
}
} output {
if [type] == "a-log" {
elasticsearch {
hosts => ["192.168.118.14"]
index => "a-log-%{+YYYY.MM.dd}"
}
}
}

上面修改的部分, input 里 增加了 type 字段,定义了唯一标识而在 output 中 通过if判断唯一标识来做响应的写入操作。

启动服务:

[root@192.168.118.14 ~]#logstash -f /etc/logstash/conf.d/

通过 elasticsearch-head 查看:

这次就完全符合预期的标准了。

3. 为logstash 增加模板

通过 elasticsearch-head 查看到 elasticsearch 默认是通过分片入库的,而且默认是 5 个主分片,5 个备份分片。 当作为日志存储时,数据可能没那么重要,不需要做 elasticsearch 的集群,但是也不想看到这些告警信息,这时候就需要 模板 了。

这里直接提供一个模板样本,可以直接使用。

{
"template" : "*", "version" : ,
"settings" : {
"index.refresh_interval" : "5s",
"number_of_shards": ,
"number_of_replicas":
},
"mappings" : {
"_default_" : {
"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" :
}
}
}
}
}],
"properties" : {
"@timestamp" : {
"type" : "date"
}, "@version" : {
"type" : "keyword"
}, "geoip" : {
"dynamic" : true, "properties" : {
"ip" : {
"type" : "ip"
}, "location" : {
"type" : "geo_point"
}, "latitude" : {
"type" : "half_float"
}, "longitude" : {
"type" : "half_float"
}
}
}
}
}
}
}

template.json

放置在这里目录里:

[root@192.168.118.14 ~]#ls /etc/logstash/template/template.json

"number_of_shards": 3,
        "number_of_replicas": 0

这一部分就是定义 主分片 和  复制分片的,可以适当的调整。

            "properties" : {
"@timestamp" : {
"type" : "date"
}, "@version" : {
"type" : "keyword"
}, "geoip" : {
"dynamic" : true, "properties" : {
"ip" : {
"type" : "ip"
}, "location" : {
"type" : "geo_point"
}, "latitude" : {
"type" : "half_float"
}, "longitude" : {
"type" : "half_float"
}
}
}
}

当要使用地图定位客户端位置的时候,这一段就必须加上, location 的type 的必须是 geo_point

为 logstash 配置文件添加模板配置,如下:

a.conf
input {
file {
path => "/data/log/a.log"
start_position => "beginning"
sincedb_path => "/tmp/a_progress"
type => "a-log"
}
} output {
if [type] == "a-log" {
elasticsearch {
hosts => ["192.168.118.14"]
index => "a-log-%{+YYYY.MM.dd}"
template => "/etc/logstash/template/template.json"
template_overwrite => "true"
}
}
} 1.conf
input {
file {
path => "/data/log/1.log"
start_position => "beginning"
sincedb_path => "/tmp/1_progress"
type => "1-log"
}
} output {
if [type] == "1-log" {
elasticsearch {
hosts => ["192.168.118.14"]
index => "1-log-%{+YYYY.MM.dd}"
template => "/etc/logstash/template/template.json"
template_overwrite => "true"
}
}
}

启动服务

[root@192.168.118.14 ~]#logstash -f /etc/logstash/conf.d/

通过 elasticsearch-head 查看集群状态及索引分片:

ok,新增的模板已经生效。尝试为不同的索引添加不同的模板结果出现各种问题,因此创建一个通用的模板。

4. 将 logstash 作为服务启动

在上面的启动中,都是直接通过命令 logstash 来启动的,其实可以通过修改 logstash.service 启动脚本来启动服务。

修改如下:

[root@192.168.118.14 ~]#vim /etc/systemd/system/logstash.service

ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash" "-f" "/etc/logstash/conf.d"

启动服务:

[root@192.168.118.14 ~]#systemctl daemon-reload
[root@192.168.118.14 ~]#systemctl start logstash

ELK - logstash 多个配置文件及模板的使用的更多相关文章

  1. [elk]logstash的最佳实战-项目实战

    重点参考: http://blog.csdn.net/qq1032355091/article/details/52953837 不得不说这是一个伟大的项目实战,是正式踏入logstash门槛的捷径 ...

  2. ELK——Logstash 2.2 date 插件【翻译+实践】

    官网地址 本文内容 语法 测试数据 可配置选项 参考资料 date 插件是日期插件,这个插件,常用而重要. 如果不用 date 插件,那么 Logstash 将处理时间作为时间戳.时间戳字段是 Log ...

  3. ELK logstash 处理MySQL慢查询日志(初步)

    写在前面:在做ELK logstash 处理MySQL慢查询日志的时候出现的问题: 1.测试数据库没有慢日志,所以没有日志信息,导致 IP:9200/_plugin/head/界面异常(忽然出现日志数 ...

  4. ELK logstash geoip值为空故障排查

    首先我们用的是elasticsearch+kibana+logstash+filebeat 客户端filebeat收集日志后经过服务端logstash规则处理后储存到elasticsearch中,在k ...

  5. 主流框架(SSH及SSM)配置文件的模板头文件

    SSH三大框架整合配置头文件模板如下: 一:Spring配置文件(beans.xml)模板:<beans    xmlns="http://www.springframework.or ...

  6. ELK(Logstash+Elasticsearch+Kibana)的原理和详细搭建

    一. Elastic Stack Elastic Stack是ELK的官方称呼,网址:https://www.elastic.co/cn/products ,其作用是“构建在开源基础之上, Elast ...

  7. 三大框架SSH(struts2+spring+hibernate)整合时相关配置文件的模板

    最近在学SSH三大框架的整合,在此对他们整合时相关配置文件做一简单的模板总结,方便以后复用! 首先是web.xml配置文件,这里面就配置一些简单的监听器.过滤器,包括spring核心配置文件appli ...

  8. ELK logstash 启动慢的解决方法

    最近开始测试部署ELK, 在部署logstash的时候出现一个故障: logstash在第一次安装完成以后启动正常, 但是之后启动时间越来越长, 5分钟以上甚至10多分钟.以至于怀疑程序错误, 在重装 ...

  9. 【ELK】【docker】【elasticsearch】2.使用elasticSearch+kibana+logstash+ik分词器+pinyin分词器+繁简体转化分词器 6.5.4 启动 ELK+logstash概念描述

    官网地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#docker-cli-run-prod ...

随机推荐

  1. 树莓派上 Docker 的安装和使用

    Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不 ...

  2. JavaScript——判断页面是否加载完成

    前言 接上文,既然你是做一个loading的效果,你总不能一直loading,当页面完成加载的时候你总要结束吧 步骤 先说下原生的方法,再讲jquery的方法,原理是一样的 JavaScript // ...

  3. postgres高可用学习篇三:haproxy+keepalived实现postgres负载均衡

    环境: CentOS Linux release 7.6.1810 (Core) 内核版本:3.10.0-957.10.1.el7.x86_64 node1:192.168.216.130 node2 ...

  4. B-树,B+树,B*树总结

    链接地址:https://blog.csdn.net/v_JULY_v/article/details/6530142 B+树 B+ 树是一种树数据结构,是一个n叉树,每个节点通常有多个孩子,一棵B+ ...

  5. Mysql注入绕过安全狗

    转载请加原文链接:https://www.cnblogs.com/Yang34/p/12055052.html 微信公众号:信Yang安全.同步更新,欢迎关注.文末有二维码. 正好最近在搞注入,昨天现 ...

  6. 原生js打地鼠

    我们要做的是一个打地鼠的游戏,只用原生js 1.导入需要的图片 2.编写页面css样式demo.css *{ margin:0; padding:0; } .game{ position: relat ...

  7. Log4net 控制台打印日志(二)

    1.创建控制台程序 2.用NuGet添加log4net引用 3.添加应用程序配置文件:App.config 4.添加配置信息: <?xml version="1.0" enc ...

  8. 开源项目 02 HttpLib

    using JumpKick.HttpLib; using Newtonsoft.Json; using System; using System.Collections.Generic; using ...

  9. CF 768B

    CF 768B题意:In each operation Sam must remove any element x, such that x>1, from the list and inser ...

  10. 2、kafka集群搭建

    以三台为例,先安装一台,然后分发: 一.准备 1.下载 http://kafka.apache.org kafka_2.11-2.0.1.tgz 前面的数字2.11是scala的版本,2.0.1是ka ...