filebeat多實例運行:
?? ?1)需求
一臺服務器上,需要運行多個filebeat實例
?? ?2)啟動filebeat實例1
cat > config/11-log_tcp-to-console.yaml <<EOF
filebeat.inputs:
- type: log
? paths:
? ? - /tmp/oldboyedu-linux82/*.log
??
? # 監聽TCP的參數
- type: tcp
? # 監聽的IP:port
? host: 0.0.0.0:8888
output.console:
? pretty: true
EOF
./filebeat -e -c config/11-log_tcp-to-console.yaml
?? ?
?? ?
?? ?3)啟動filebeat實例2
cat > config/10-es_error-to-es.yaml <<EOF
filebeat.inputs:
- type: log
? paths:
? ? - /oldboyedu/logs/es7/oldboyedu-linux82-es7.log
? multiline.type: pattern
? multiline.pattern: '^\['
? multiline.negate: true
? multiline.match: after
output.elasticsearch:
? hosts:?
? - "http://10.0.0.101:9200"
? - "http://10.0.0.102:9200"
? - "http://10.0.0.103:9200"
? index: "oldboyedu-linux82-es-error-%{+yyyy.MM.dd}"?
setup.ilm.enabled: false?
setup.template.name: "oldboyedu-linux82-es"
setup.template.pattern: "oldboyedu-linux82-es-*"
setup.template.settings:
? index.number_of_shards: 3
? index.number_of_replicas: 0
EOF
./filebeat -c config/10-es_error-to-es.yaml --path.data /tmp/oldboyedu-linux82-filebeat-data --path.logs /tmp/oldboyedu-linux82-filebeat-logs
Q1: 寫多個輸入端使用一個filebeat和啟動多個filebeat實例哪種方案更好?請說明原因?
?? ?
?? ?方案一: 寫多個輸入端使用一個filebeat
?? ??? ?優點:
?? ??? ??? ?1)啟動一個filebeat實例即可;
?? ??? ??? ?2)配置需要配置一個即可;
?? ??? ??? ?3)當業務不是特別復雜時,維護起來相對來說比較方便;
?? ??? ??? ?
?? ??? ?缺點:
?? ??? ??? ?1)有特定要求,輸出端只有一個;
?? ??? ??? ?2)維護起來耦合性較強,當多個input類型,有任何一個需要修改時,需要停止整個服務,盡管其他的input類型不需要修改,影響較大;
?? ??? ??? ?3)當配置文件參數較多時,可讀性較差,拍錯成功也增長了;
?? ??? ??? ?
?? ??? ?
?? ?方案二: 啟動多個filebeat實例
?? ??? ?優點:
?? ??? ??? ?1)方便指定多個輸出類型,可以定制化;
?? ??? ??? ?2)沒有太強的耦合性,如果某個業務需要修改,僅需要修改對應的filebeat實例的配置文件即可,其他filebeat實例并不會受到影響;
?? ??? ??? ?3)當配置較多時,后期維護也非常方便;
?? ??? ??? ?
?? ??? ?缺點:
?? ??? ??? ?1)需要運維人員維護多份配置文件;
?? ??? ??? ?2)需要啟動多個filebeat實例;
?? ??? ??? ?
?? ??? ??? ?
cat > config/12-tcp_http-to-console.yaml <<EOF
filebeat.inputs:
- type: tcp
? host: 0.0.0.0:8888
? # 對應的是一個http協議的輸入端。?
- type: http_endpoint
? # 監聽地址
? listen_address: 0.0.0.0
? # 監聽的端口
? listen_port: 8080
? # 響應狀態碼
? response_code: 222
? # 響應消息
? response_body: '{"message": "oldboyedu linux82 success"}'
? # 客戶端請求路徑
? url: "/linux82"
? # 頂級字段接受消息的前綴名稱
? prefix: "oldboyedu-linux82-json"
output.console:
? pretty: true
EOF
filestream和log類型的區別:
?? ?1)配置JSON解析格式字段有區別
cat > config/13-filestream-to-console.yaml <<EOF
filebeat.inputs:
? # 指定類型是一個文件流
- type: filestream
? # 指定文件的路徑
? paths:
? ? - /var/log/nginx/access.log
? # 配置解析器
? parsers:
? ? # 配置JSON格式解析的
? - ndjson:
? ? ? # 指定解析JSON格式的數據存儲路徑的KEY,若不指定,則將解析后的結果存放在頂級字段。
? ? ? target: ""
output.console:
? pretty: true
EOF
?? ?2)多行匹配問題
cat > config/14-filestream-to-console.yaml <<EOF
filebeat.inputs:
- type: filestream
? paths:
? ? - /oldboyedu/logs/es7/oldboyedu-linux82-es7.log
? parsers:
? ? # 配置多行匹配
? - multiline:
? ? ? type: pattern
? ? ? pattern: '^\['
? ? ? negate: true
? ? ? match: after
output.elasticsearch:
? hosts:?
? - "http://10.0.0.101:9200"
? - "http://10.0.0.102:9200"
? - "http://10.0.0.103:9200"
? index: "oldboyedu-linux82-es-error-%{+yyyy.MM.dd}"?
setup.ilm.enabled: false?
setup.template.name: "oldboyedu-linux82-es"
setup.template.pattern: "oldboyedu-linux82-es-*"
setup.template.settings:
? index.number_of_shards: 3
? index.number_of_replicas: 0
EOF
filebeat的模塊使用:
?? ?1)模塊的基本管理
./filebeat modules enable nginx tomcat mysql
?? ?啟用模塊
./filebeat modules list
?? ?查看模塊列表
./filebeat modules disable tomcat mysql
?? ?禁用模塊
?? ?
?? ?
?? ?2)模塊的管理的底層原理
mv modules.d/{tomcat.yml.disabled,tomcat.yml}
mv modules.d/{mysql.yml.disabled,mysql.yml}
?? ?啟用tomcat和mysql模塊。
?? ?
mv modules.d/{mysql.yml,mysql.yml.disabled}
mv modules.d/{tomcat.yml,tomcat.yml.disabled}
?? ?禁用tomcat和mysql模塊。
?? ?3)修改nginx模塊的配置文件
cat > modules.d/nginx.yml <<EOF
- module: nginx
? access:
? ? enabled: true
? ? var.paths: ["/var/log/nginx/access.log*"]
? error:
? ? enabled: true
? ? var.paths: ["/var/log/nginx/error.log*"]
? ingress_controller:
? ? enabled: false
EOF
?? ?
?? ?4)使用nginx模塊測試
cat > config/15-modules-to-console.yaml <<EOF
# 啟動模塊,若啟用了模塊,則可以不指定input類型
filebeat.config.modules:
? # 指定模塊的配置文件路徑,"${path.config}"是filebeat的內置變量,表示filebeat安裝目錄。
? path: ${path.config}/modules.d/*.yml
? # 是否支持熱加載
? reload.enabled: true
output.elasticsearch:
? hosts:?
? - "http://10.0.0.101:9200"
? - "http://10.0.0.102:9200"
? - "http://10.0.0.103:9200"
? index: "oldboyedu-linux82-nginx-access-%{+yyyy.MM.dd}"?
setup.ilm.enabled: false?
setup.template.name: "oldboyedu-linux82-nginx"
setup.template.pattern: "oldboyedu-linux82-nginx-access-*"
setup.template.settings:
? index.number_of_shards: 3
? index.number_of_replicas: 0
EOF
?? ?5)請說一下Modules工作原理
1.啟動filebeat實例;
2.讀取配置文件,找Input|modules,output?
?? ?若沒有指定input,則必須配置modules,找到啟用的modules文件后讀取相關的配置文件。從而找到需要watch的文件。
3.模塊的作用不僅僅是指定input的文件位置,而且還會源源數據進行解析為JSON格式喲,只不過這個解析方式是官方指定的,我們去修改這種格式定義就不太方便啦;
?? ?
?? ?溫馨提示:
?? ??? ?(1)實際工作中,很多運維小伙伴都會直接使用input,因為input可以定制化源日志格式;
?? ??? ?(2)官方的modules支持的中間件服務類型是有限的,在實際工作中,可能有的中間件或者你們公司開發的閉源產品日志可能需要你手動配置;
filebeat輸入端通用字段:
?? ?enabled:?
?? ??? ?表示是否啟用當前的input類型,若不設置,則默認值為true。
?? ??? ?
?? ?tags:
?? ??? ?filebeat給每條消息打標記。
?? ??? ?
?? ?fields:
?? ??? ?為消息添加自定義字段
?? ??? ?
?? ?fields_under_root:
?? ??? ?若指定為true,則將自定義字段放在消息的頂級字段中
?? ??? ?若不指定,則默認值為false,會將自定義字段放在一個"fields"字段下喲~
?? ??? ?
?? ?processors:
?? ??? ?自定義處理器,可以根據用戶需求,來對input數據源進行處理分析。
?? ??? ?推薦閱讀:
?? ??? ??? ?https://www.elastic.co/guide/en/beats/filebeat/7.17/defining-processors.html
?? ??? ??? ?https://www.elastic.co/guide/en/beats/filebeat/7.17/defining-processors.html#processors
?? ??? ?
參考案例:
cat > config/16-input_common_options-to-console.yaml <<EOF
filebeat.inputs:
- type: tcp
? host: 0.0.0.0:8888
? # 是否啟用該類型,默認值為true。
? enabled: false
? # 給當前類型打tag
? tags: ["oldboyedu-linux82-tcp","oldboyedu-elk","oldboyedu-linux"]
? # 為消息添加自定義字段
? fields:
? ? school: oldboyedu
? ? class: linux82
? # 若指定為true,則將自定義字段放在消息的頂級字段中
? # 若不指定,則默認值為false,會將自定義字段放在一個"fields"字段下喲~
? fields_under_root: true
? # 自定義處理器,可以對數據進行處理
? # processors:
? # ? ? # 刪除事件(event)
? # ? - drop_event:
? # ? ? ? # when語句表示當滿足某個條件執行相應的動作
? # ? ? ? when:
? # ? ? ? ? # 匹配正則表達式
? # ? ? ? ? regexp:
? # ? ? ? ? ? # 要求message字段包含以"INFO:"開頭的時間,直接刪除時間!
? # ? ? ? ? ? message: "^INFO:"
? #
- type: log
? enabled: true
? paths:
? - /tmp/oldboyedu-linux82/*
? # 自定義處理器,刪除包含"info:"所有事件。
? processors:
? ? - drop_event:
? ? ? ? when:
? ? ? ? ? contains:
? ? ? ? ? ? message: "info:"?
output.console:
? pretty: true
EOF
?? ?
filebeat收集docker日志:
?? ?1)安裝docker環境
tar xf oldboyedu-docker-ce-20_10_17.tar.gz?
cd docker-ce-20_10_17/ && yum -y localinstall *.rpm
?? ?
?? ?2)添加自動補全功能
source /usr/share/bash-completion/bash_completion
?? ?3)配置鏡像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
? "registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
?? ?4)加載nginx鏡像
docker load -i oldboyedu-nginx_1-20-1.tar.gz
?? ?5)啟動nginx容器
docker run -dp 88:80 --name oldboyedu-linux82-nginx ?nginx:1.20.1 ?# 啟動容器
docker logs -f oldboyedu-linux82-nginx ? # 查看日志
?? ?6)使用filebeat收集docker日志案例一,7.2版本已廢棄,不推薦使用。
cat > config/17-docker-to-console.yaml ?<<EOF
filebeat.inputs:
? # 數據源的類型為docker
- type: docker
? # 指定docker容器的ID,可以匹配所有的容器ID,也可以指定容器ID進行匹配
? containers.ids:?
? ? - '*'
output.console:
? pretty: true
EOF
?? ?7)使用filebeat收集docker日志案例二,推薦使用。
cat > config/18-container-to-console.yaml <<EOF
filebeat.inputs:
? # 數據源的類型為container
- type: container
? # 指定容器日志的路徑
? paths:?
? ? - '/var/lib/docker/containers/*/*.log'?
? # 指定收集的日志類型,合法的參數為: all,stdout,stderr
? stream: stdout
output.console:
? pretty: true
EOF
kibana組件的基本使用:
?? ?(1)安裝kibana
yum -y localinstall kibana-7.17.5-x86_64.rpm
?? ?(2)修改kibana的配置文件
vim /etc/kibana/kibana.yml?
...
# kibana的監聽端口
server.port: 5601
# kibana的服務器IP
server.host: "0.0.0.0"
# kibana服務器的名稱,可以自定義
server.name: "oldboyedu-linux82-kibana"
# 指定ES集群的地址
elasticsearch.hosts: ["http://10.0.0.101:9200","http://10.0.0.102:9200","http://10.0.0.103:9200"]
# kibana支持的語言
i18n.locale: "zh-CN"
?? ?(3)啟動kibana服務
systemctl start kibana
?? ?(4)查看kibana的端口號
ss -ntl | grep 5601
?? ?(5)訪問kibana的WebUI
http://10.0.0.101:5601/
?? ?(6)添加官方樣例圖
見視頻。