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也很久不用了的狀態,還面臨着完成業務需求的緊迫感,大機率仍是會略過這段。

現學現用,真的很痛苦!

這期間,關鍵是要準確的定位問題,而後逢山開路,遇水搭橋,其實也不失爲一次蛻變的體驗!

關鍵的關鍵在於,要相信本身最終仍是會搞定的

相關文章
相關標籤/搜索