由於這周要開始作埋點日記的分析,因此初步調研後,準備用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也很久不用了的狀態,還面臨着完成業務需求的緊迫感,大機率仍是會略過這段。
現學現用,真的很痛苦!
這期間,關鍵是要準確的定位問題,而後逢山開路,遇水搭橋,其實也不失爲一次蛻變的體驗!
而關鍵的關鍵在於,要相信本身最終仍是會搞定的。