決定寫一遍文檔 記錄容器化elk+filebeat 的學(xué)習(xí)過程的心得日志, 記錄的出發(fā)點(diǎn)是從我一臉懵逼的狀態(tài)開始的,所以應(yīng)該會很適合第一次接觸elk的朋友們.
Tips:
- 原則上filebeat 需要跟elk的大版本號一致, 我目前使用的elk是6.3.0 filebeat是6.3.1 docker.elastic.co/beats/filebeat:6.3.1
- 默認(rèn)的logstash讀取beat是打開ssl的. 取消logstash里的ssl或者在filebeats正確使用ssl證書.
獲取鏡像
docker pull sebp/elk:630
docker pull docker.elastic.co/beats/filebeat:6.3.1
運(yùn)行 elk
docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk
啟動elk意外的簡單,體現(xiàn)出了容器化的優(yōu)點(diǎn),非常簡單的就能啟動程序, 打開kibana的5601端口進(jìn)去溜達(dá)一下了, 但是里面是空的 沒有數(shù)據(jù). 我學(xué)習(xí)elk的目的是為了監(jiān)控我目前正在使用的docker log,所以下一步是打斷用filebeat來轉(zhuǎn)發(fā)日志到elk上.
首先用filebeat轉(zhuǎn)發(fā)本地的一個(gè)log.txt文件 一會我們往里面echo 東西做調(diào)試.
運(yùn)行 filebeat
docker run -v /home/daniel/Documents/elk/filebeat.yml:/usr/share/filebeat/filebeat.yml -v /home/daniel/Documents/elk/:/home/daniel/Documents/elk/ docker.elastic.co/beats/filebeat:6.3.1
filebeat可以把日志直接轉(zhuǎn)發(fā)到ES 或者轉(zhuǎn)發(fā)到logstash, 其中的區(qū)別取決于你是否需要在ES之前需要對數(shù)據(jù)進(jìn)行過濾 聚合等操作, 如果暫時(shí)沒需求 也可以直接轉(zhuǎn)到ES上, (這里建議先發(fā)到ES上, logstash會遇到SSL證書的問題) 或者轉(zhuǎn)到redis或者kafka后面再學(xué)習(xí)這種情況.
filebeat啟動也很簡單, 問題是啟動了之后 elk里啥也沒有.查了很多文檔 發(fā)現(xiàn)filebeat啟動需要掛載filebeat.yml配置文件
output.logstash:
enabled: false
hosts:
- 192.168.0.98:5044
output.elasticsearch:
enabled: true
hosts:
- 192.168.0.98:9200
filebeat:
inputs:
- type: log
enabled: true
paths:
- /home/daniel/Documents/elk/nima.log
這里的output配置了logstash跟es的,暫時(shí)先把logstash的disable掉, 注意不要使用localhost, 不然連不上 需要使用LAN ip.
啟動filebeat時(shí)掛載了兩個(gè)目錄,第一個(gè)是filebeat.yml, 這是filebeat的配置文件,需要掛載進(jìn)去.
第二個(gè)是需要監(jiān)控的log目錄 也需要掛載進(jìn)去.
掛載log目錄跟filebeat.yml配置一樣的 log目錄之后, 會發(fā)現(xiàn)filebeat啟動時(shí)會打印
Harvester started for file: /home/daniel/Documents/elk/nima.log
如果沒有掛載log目錄,則沒有havester啟動信息.
現(xiàn)在就可以在elk里看到Log了. 第一步成功了.
這里如果要output到logstash的話,需要注意要么filebeat要使用logstash里的ssl證書,要么logstash把默認(rèn)的配置filebeat的文件去掉ssl功能.
我是通過重新打docker image的方式去掉logstash里的ssl配置
把 /etc/logstash/conf.d/02-beats-input.conf 拷貝出來 把里面關(guān)于SSL的三行去掉
docker cp CONTAINER_ID /etc/logstash/conf.d/02-beats-input.conf .
創(chuàng)建Dockerfile
FROM sebp/elk
# overwrite existing file
ADD ./02-beats-input.conf /etc/logstash/conf.d/02-beats-input.conf
docker build -t my_elk .
docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name my_elk my_elk
有一個(gè)問題是 每次把filebeat docker 關(guān)了 再run之后發(fā)現(xiàn) elk里的log每次都重新讀取了一次,都是重復(fù)的,
然后查看文檔 在filebeat里 有一個(gè)registry的文件是負(fù)責(zé)記錄讀取的log的狀態(tài)的, 而我每次啟動filebeat都是docker run一個(gè)新的
而不是 繼續(xù)用老的filebeat 容器, 所以會重復(fù), 總之就是 filebeat跟elk的容易不需要每次都創(chuàng)建,因?yàn)樗麄冊谌萜鲀?nèi)都會需要記錄一下內(nèi)容.
下一步是準(zhǔn)備用filebeat轉(zhuǎn)發(fā)目前使用中的docker的log
首先需要要需要轉(zhuǎn)發(fā)log的機(jī)器上運(yùn)行filebeat
docker tag docker.elastic.co/beats/filebeat i71:5000/filebeat
docker push i71:5000/filebeat
后面這個(gè)是我在使用的docker private registry
然后再目標(biāo)機(jī)器上pull下來
docker pull i71:5000/filebeat
docker log所在的目錄是 /var/lib/docker/containers//.log
可以在path中 指定這個(gè)地方
然后別忘了啟動filebeat時(shí)掛在docker container log目錄
docker run -v /root/elk/filebeat.yml:/usr/share/filebeat/filebeat.yml -v /var/lib/docker/containers:/var/lib/docker/containers i71:5000/filebeat
發(fā)現(xiàn)filebeat啟動時(shí)沒有havester啟動的日志
docker exec CONTAINER_ID bash
進(jìn)去看一下發(fā)現(xiàn)掛在的docker目錄沒權(quán)限 進(jìn)不去
所以需要在宿主機(jī)執(zhí)行sudo chmod -R 755 /var/lib/docker/containers
給上讀與執(zhí)行的權(quán)限
再次啟動filebeat就可以看到havester的消息了.
這樣的配置方法是可以拿到所有docker的log 優(yōu)點(diǎn)是 以后新創(chuàng)建的docker的log也會被捕獲到, 缺點(diǎn)是 如果機(jī)器上的docker 太多的話,log會很多,目前我還不會過濾 所以 看著很難受
elk 官方提供了一種實(shí)驗(yàn)性的讀取docker log的 filebeat配置方式
https://www.elastic.co/guide/en/beats/filebeat/6.3/filebeat-input-docker.html
- type: docker
containers:
path: "/var/lib/docker/containers"
stream: "stdout"
ids:
- "CONTAINER_ID"
- "CONTAINER_ID"
注意這里的container_id不能使簡寫 , 可以先用docker ps
看到簡寫id之后在ls /var/lib/docker/containers/
里去找
或者 使用命令 docker ps --no-trunc=true
獲得container 完整ID
這樣就簡潔多了,就是發(fā)版本時(shí)docker 新容器需要重新配置, 暫時(shí)就這么用吧,先研究一下
現(xiàn)在就算是正式的可以使用elk 查看我們的docker log了
我現(xiàn)在首先遇到的一個(gè)明顯的問題是 當(dāng)python出異常時(shí) 打印出來的log 在elk里都分散開了, 而且時(shí)間順序也沒對,查看起來非常難受. 后來查到 這種事情需要配置一個(gè)叫multipleline的東西,它負(fù)責(zé)決定什么時(shí)候出換行
貼一下現(xiàn)在的filebeat配置文件, 整個(gè)世界清爽了很多啊
output.logstash:
hosts: ["192.168.0.98:5044"]
filebeat.inputs:
- type: docker
enabled: true
multiline.pattern: ^\[
multiline.negate: true
multiline.match: after
containers.ids:
- 'd64f1da9c5bc647f8ede44ba8bebb13c31b047103ed6033297f3c4bd666cfa05'
- '5ae2f7cec9aa7c0a525c0e0c0201892b08e89e12b0b618491e45186848955f5c'
關(guān)于multiline,參考:
參考 http://www.madhur.co.in/blog/2017/04/30/view-exceptions-in-elk.html 這個(gè)是不以空格開頭的 都合并
我感覺這個(gè)不適合python所以選擇了 下面這種正則 不以[開頭的都合并.
https://blog.csdn.net/xiaoliuliu2050/article/details/77867401 這個(gè)適合python