由于这周要开始作埋点日记的分析,因此初步调研后,准备用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也很久不用了的状态,还面临着完成业务需求的紧迫感,大几率仍是会略过这段。
现学现用,真的很痛苦!
这期间,关键是要准确的定位问题,而后逢山开路,遇水搭桥,其实也不失为一次蜕变的体验!
而关键的关键在于,要相信本身最终仍是会搞定的。