logstash docker部署的踩坑笔记

由于这周要开始作埋点日记的分析,因此初步调研后,准备用filebeat+logstash+mongodb来作。html

基于golang写的filebeat比较轻量,解压后就能够直接用了,而logstash还有好多依赖要装,因此坚决果断就选择用docker来部署。golang

由于是现学现用,时间也有些紧,再加上彻底是新手入门,看到文档Configuaring Logstash for Docker中Bind-mounted settings files这段后,mongodb

就本身定义了一个logstash.ymldocker

input{
  beats {
    port => 5044
  }
}

output{
   mongodb {
    uri => "mongodb://localhost:27017"
    database => "spot_logs"
    collection => "raw_data"
  }
}
复制代码

心想着这样经过volume挂进去就能够用了。ruby

docker run  --rm -it -v ./logstash.yml:/usr/share/logstash/config/logstash.yml docker.elastic.co/logstash/logstash:7.2.0
复制代码

而后,悲剧开始了~~~bash

首先,我定义的实际上是一个.conf文件,而不是logstash.yml。ide

因而,刚一启动就报错了。ui

当我通过一番搜索,知道这实际上是一个conf文件后,就直接改把它的后缀名改为了.conf,而后执行了spa

docker run --rm --network host -it -v ./logstash.conf:/usr/share/logstash/config/logstash.conf docker.elastic.co/logstash/logstash:7.2.0
复制代码

而后,“奇迹发生”了~~filebeat发过来日志,logstash都能收到,并且还打印了出来(好神奇,那但是我第一次跑通filebeat+logstash),可是还没开心1分钟,就发现mongodb里根本没数据。debug

而后,没有方向的我,开始了一通乱试(略去不表,其实都是泪),白白耗费了一个下午加晚上也没找到缘由(那时真是心情沉重,想着这个sprint估计有点难交差了!)。

回到家后,洗了澡,从新开始思考这个问题的时候,我忽然意识到,可能我设置的配置根本就不起做用,如今的行为没准是logstash镜像的默认行为。(在时间压力下,现学现用,很容易钻牛角尖,这时暂停下来,平静心情,换个思路很重要!

查了一下logstash官方的dockerfile也没发现什么,到是在一篇搜索到文章中,发现多是e受容器里的pipelines.yml的影响。

当我打开容器里的/usr/share/logstash/config/pipelines.yml的时候,看见:

- pipeline.id: main
  path.config: "/usr/share/logstash/pipeline"
复制代码

再打开 /usr/share/logstash/pipeline,看到:

input {
  beats {
    port => 5044
  }
}

output {
  stdout {
    codec => rubydebug
  }
}
复制代码

真是一口老血喷出来~心想好坑呀,隐藏的这么深!

因而,仿造这个pipelines.yml,也写了个pipelines.yml,把config指向本身的配置。

- pipeline.id: main
  path.config: "/usr/share/logstash/config/logstash.conf"
  pipeline.workers: 3
复制代码

再挂载进docker启动后,看到mongodb的报错信息后,就知道本身的设置终于生效了。

报错的缘由,是由于logstash-output-mongodb这个output默认是没有的,须要本身装好,解决方法也很简单,自定义一个dockerfile,作一个安装好logstash-output-mongodb的镜像就好。

同时,在这里我也把本身写的放在config文件里的pipelines.yml和logstash.conf拷了进去,具体内容以下;

FROM docker.elastic.co/logstash/logstash:7.2.0
RUN rm -f /usr/share/logstash/pipeline/logstash.conf
COPY ./config/ /usr/share/logstash/config/
RUN logstash-plugin install logstash-output-mongodb
复制代码

而后运行:

docker build -f logstash.dockerfile -t mine/logstash:1.0
复制代码

最后定义了一个docker-compose.logstash.yml文件:

version: '3'

services:
  logstash:
    image: mine/logstash:1.0
    restart: always
    container_name: finxos_logstash
    network_mode: 'host'
    volumes:
      - "$PWD/config/logstash.conf:/usr/share/logstash/config/logstash.conf"
    depends_on:
      - mongodb

  mongodb:
    image: mongo:4.0
    restart: always
    container_name: finxos_mongodb
    volumes:
      - "$PWD/mongodb_data:/data/db"
    network_mode: 'host'
复制代码

这样就能够经过下面的命令一键启动了。

docker-compose -f docker-compose.logstash.yml up
复制代码

写在最后

在下笔前,我是心想着写下本身的踩坑经验,估计会对他人有用。

可是写着的时候,才发现我以为很坑的默认行为,其实在Configuaring Logstash for Docker的Pipeline Configuration章节里有提到。

而当时的我急着赶忙用起来,看到Pipeline也不知道是干什么的(其实如今也不是很清楚),就直接跳到Settings章节了。

真的是要好好看文档!抓住重要信息呀!

可是再一想,即再来一次,以当时的我刚刚接触filebeat+logstash, docker也很久不用了的状态,还面临着完成业务需求的紧迫感,大几率仍是会略过这段。

现学现用,真的很痛苦!

这期间,关键是要准确的定位问题,而后逢山开路,遇水搭桥,其实也不失为一次蜕变的体验!

关键的关键在于,要相信本身最终仍是会搞定的

相关文章
相关标签/搜索