【老男孩Linux技術分享】5分鐘帶你搞懂日誌採集利器Filebeat!
filebeat是用於" 轉發"和" 集中日誌資料"的輕量級資料採集器。
filebeat會監視指定的日誌檔案路徑,收集日誌事件並將資料轉發到elasticsearch,logstash,redis,kafka儲存伺服器。
當您要面對成百上千,甚至成千上萬的伺服器,虛擬機器的容器生成的日誌時,請告別SSH吧。
Filebeat將為您提供一種輕量級方法,用於轉發和彙總日誌與檔案,讓簡單的事情不再繁雜。
| Filebeat的元件
Filebeat包含兩個主要元件, input(輸入)和Harvester(收割機),兩個元件協同工作將檔案的尾部最新資料傳送出去。
Harveste元件: 負責逐行讀取單個檔案的內容,然後將內容傳送到輸出。
input元件: 輸入負責管理收割機並找到所有要讀取的源。該引數的原始檔路徑需要使用者手動配置。
Spooler(緩衝區): 將Harvester元件採集的資料進行統一的快取,併發往目的端,可以是 Elasticsearch, Logstash , kafka 和 Redis 等。
| Filebeat工作原理
filebeat工作流程如下:
1、filebeat啟動後,filebeat透過Input讀取指定的日誌路徑;
2、為該檔案日誌啟動收割程式harvester,每個收割程式讀取一個日誌檔案的新內容,併傳送這些新的日誌資料到處理程式spooler;
3、spooler會集合這些事件,最後filebeat會傳送集合的資料到你指定的位置。
Filebeat如何保持檔案的狀態?
Filebeat保持每個檔案的狀態,並經常將狀態重新整理到登錄檔檔案(data/registry/filebeat/log.json)中的磁碟。
該狀態用於記住收割機讀取的最後一個偏移量,並確保傳送所有日誌行。
Filebeat如何確保至少一次交付?
Filebeat保證事件將至少傳送到配置的輸出一次並且不會丟失資料。
Filebeat能夠實現這種行為,因為它將每個事件的傳遞狀態儲存在登錄檔檔案中。
部署Filebeat環境
| 安裝Filebeat軟體
# 編譯安裝Filebeatwget tar xf filebeat-7.12.1-linux-x86_64.tar.gz -C /oldboyedu/softwares/cd /oldboyedu/softwares/ln -s filebeat-7.12.1-linux-x86_64 filebeat vim /etc/profile.d/filebeat.sh# 新增Filebeat的環境變數cat /etc/profile.d/filebeat.sh#!/bin/bashexport FILE_BEAT=/oldboyedu/softwares/filebeat export PATH=$PATH:$FILE_BEAT# 使環境變數生效source /etc/profile.d/filebeat.sh # 檢視環境變數是否生效which filebeat
| filebeat引數介紹
| 執行第一個例項
將標準輸入的資料進行標準輸出
vim stdin-to-console.yaml filebeat.inputs:- type: stdin enabled: true output.console: pretty: true enable: true# 檢視filebeat的輸出filebeat -e -c stdin-to-console.yaml
企業實戰
| nginx日誌收集
安裝nginx
yum -y install epel-release yum -y install nginx
建立配置檔案
vim /etc/nginx/conf.d/elk103.oldboyedu.com.conf server { listen 80; server_name es.oldboyedu.com; root /oldboyedu/data/nginx/; location / { index index.html; }}
建立測試資料
mkdir -p /oldboyedu/data/nginx/echo "<h1>老男孩教育</h1>" > /oldboyedu/data/nginx/index.html
檢查配置檔案
nginx -t
啟動nginx服務
systemctl start nginx
測試nginx服務
# 編寫指令碼vim /server/scripts/nginx.sh #!/bin/bashwhile true do for i in "curl es.oldboyedu.com" do Time=$((RANDOM%5 +1 )) echo "本次間隔時間為:$Time" curl elk103.oldboyedu.com sleep $Time done done
配置nginx收集JSON並重啟nginx
# 修改nginx的配置檔案vim /etc/nginx/nginx.conf...# 自定義nginx的日誌格式為json格式log_format oldboyedu_nginx_json '{"@timestamp":"$time_iso8601",' '"host":"$server_addr",' '"clientip":"$remote_addr",' '"size":$body_bytes_sent,' '"responsetime":$request_time,' '"upstreamtime":"$upstream_response_time",' '"upstreamhost":"$upstream_addr",' '"http_host":"$host",' '"uri":"$uri",' '"domain":"$host",' '"xff":"$http_x_forwarded_for",' '"referer":"$http_referer",' '"tcp_xff":"$proxy_protocol_addr",' '"http_user_agent":"$http_user_agent",' '"status":"$status"}';access_log /var/log/nginx/access.log oldboyedu_nginx_json;# 測試配置檔案是否正常nginx -t# 重新載入nginxsystemctl restart nginx
配置filebeat的配置檔案
vim 01-nginx-to-es.yaml filebeat.inputs:- type: log paths: - /var/log/nginx/access.log tags: "nginx" # 預設值為false,我們需要修改為true,即不會將訊息儲存至message欄位! json.keys_under_root: true output.elasticsearch: hosts: ["192.168.56.130:9200","192.168.56.131:9200","192.168.56.132:9200"] #index: "oldboy-2022-%{[agent.version]}-%{+yyyy.MM.dd}" indices: - index: "oldboyedu-nginx2022-%{+yyyy.MM.dd}" when.contains: tags: "nginx"# 禁用索引的生命週期!setup.ilm.enabled: false# 指定索引模板的名稱setup.template.name: "oldboyedu"# 指定索引模板的匹配模式setup.template.pattern: "oldboyedu-nginx*"# 指定索引模板的分片資訊setup.template.settings: index.number_of_shards: 5 index.number_of_replicas: 0
收集nginx的錯誤日誌
vim 02-nginx-to-es.yaml filebeat.inputs:- type: log paths: - /var/log/nginx/access.log tags: "nginx-access" # 預設值為false,我們需要修改為true,即不會將訊息儲存至message欄位! json.keys_under_root: true- type: log paths: - /var/log/nginx/error.log tags: "nginx-error"output.elasticsearch: hosts: ["192.168.56.130:9200","192.168.56.131:9200","192.168.56.132:9200"] #index: "oldboy-2022-%{[agent.version]}-%{+yyyy.MM.dd}" indices: - index: "oldboyedu-nginx-access-%{+yyyy.MM.dd}" when.contains: tags: "nginx-access" - index: "oldboyedu-nginx-error-%{+yyyy.MM.dd}" when.contains: tags: "nginx-error"# 禁用索引的生命週期!setup.ilm.enabled: false# 指定索引模板的名稱setup.template.name: "oldboyedu"# 指定索引模板的匹配模式setup.template.pattern: "oldboyedu-nginx*"# 指定索引模板的分片資訊setup.template.settings: index.number_of_shards: 5 index.number_of_replicas: 0
| Nginx多虛擬主機
配置nginx的多虛擬主機
vim /etc/nginx/conf.d/bbs.oldboyedu.com.conf server { listen 80; server_name bbs.oldboyedu.com; root /oldboyedu/data/nginx/bbs; # 指定access.log的儲存路徑及日誌格式. access_log /var/log/nginx/bbs.log oldboyedu_nginx_json; location / { index index.html; }}vim /etc/nginx/conf.d/blog.oldboyedu.com.conf server { listen 80; server_name blog.oldboyedu.com; root /oldboyedu/data/nginx/blog; # 指定access.log的儲存路徑及日誌格式. access_log /var/log/nginx/blog.log oldboyedu_nginx_json; location / { index index.html; }}
建立測試資料
mkdir -p /oldboyedu/data/nginx/{blog,bbs}echo "<h1>blog</h1>" > /oldboyedu/data/nginx/blog/index.html echo "<h1>bbs</h1>" > /oldboyedu/data/nginx/bbs/index.html# 檢查配置檔案的語法nginx -t# 修改主機名對映vim /etc/hosts...192.168.56.132 blog.oldboyedu.com192.168.56.132 bbs.oldboyedu.com# 重啟nginx服務systemctl restart nginx# 測試服務curl blog.oldboyedu.com curl bbs.oldboyedu.com
編寫fielbeat的yaml
vim nginx_vm_host.yaml filebeat.inputs:- type: log enabled: true paths: - /var/log/nginx/access.log # false會將json解析的格式儲存至message,改為true則不儲存至message json.keys_under_root: true # 覆蓋預設的message欄位,使用自定義json格式的key json.overwrite_keys: true # 為訪問日誌("access.log")打標籤 tags: ["nginx-access"]- type: log enabled: true paths: - /var/log/nginx/blog.log # false會將json解析的格式儲存至message,改為true則不儲存至message json.keys_under_root: true # 覆蓋預設的message欄位,使用自定義json格式的key json.overwrite_keys: true # 為訪問日誌("access.log")打標籤 tags: ["nginx-blog"]- type: log enabled: true paths: - /var/log/nginx/demo.log # false會將json解析的格式儲存至message,改為true則不儲存至message json.keys_under_root: true # 覆蓋預設的message欄位,使用自定義json格式的key json.overwrite_keys: true # 為訪問日誌("access.log")打標籤 tags: ["nginx-demo"]- type: log enable: true paths: - /var/log/nginx/error.log # 為錯誤日誌("error.log")打標籤 tags: ["nginx-error"]output.elasticsearch: hosts: ["192.168.56.130:9200","192.168.56.131:9200","192.168.56.132:9200"] # index: "nginx-access-%{[agent.version]}-%{+yyyy.MM.dd}" # 注意哈,下面的標籤不再是"index"啦~ indices: - index: "nginx-access-%{[agent.version]}-%{+yyyy.MM.dd}" when.contains: tags: "nginx-access" - index: "nginx-error-%{[agent.version]}-%{+yyyy.MM.dd}" when.contains: tags: "nginx-error" - index: "nginx-blog-%{[agent.version]}-%{+yyyy.MM.dd}" when.contains: tags: "nginx-blog" - index: "nginx-demo-%{[agent.version]}-%{+yyyy.MM.dd}" when.contains: tags: "nginx-demo"setup.ilm.enabled: false# 定義模板名稱.setup.template.name: "nginx"# 定義模板的匹配索引名稱.setup.template.pattern: "nginx-*"[root@oldboy-es03 project]# filebeat -e -c nginx_vm_host.yaml
| Tomcat日誌收集
部署tomcat
tar zxf apache-tomcat-10.0.6.tar.gz -C /oldboy/softwares/cd /oldboyedu/softwares/ln -s apache-tomcat-10.0.6 tomcat# 配置JDK 的環境變數vim /etc/profile.d/tomcat.sh#!/bin/bashexport TOMCAT_HOME=/oldboyedu/softwares/tomcat export PATH=$PATH:$TOMCAT_HOME/bin# 讓環境變數生效. /etc/profile.d/tomcat.sh catalina.sh# 配置tomcat的JSON格式vim /oldboyedu/softwares/tomcat/conf/server.xml ···(大概在133行喲~) <Host name="tomcat.oldboyedu.com" appBase="webapps" unpackWARs="true" autoDeploy="true">...(需要手動註釋一下原內容)<!-- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />--><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="tomcat.oldboyedu.com_access_log" suffix=".txt"pattern="{"clientip":"%h","ClientUser":"%l","authentica ted":"%u","AccessTime":"%t","request":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/>...# 配置主機解析vim /etc/hosts...19.168.56.132 tomcat.oldboyedu.com# 啟動tomcat服務catalina.sh start# 驗證服務 略。
使用filebeat收集日誌
vim ~/conf/project/tomcat01.tomcat-to-es.yaml filebeat.inputs:- type: log paths: - /oldboyedu/softwares/tomcat/logs/tomcat.oldboyedu.com_access_log.*.txt # false會將json解析的格式儲存至message,改為true則不儲存至message json.keys_under_root: true # 為訪問日誌("access.log")打標籤 tags: "tomcat-access"output.elasticsearch: hosts: ["192.168.56.130:9200","192.168.56.131:9200","192.168.56.132:9200"] # 注意哈,下面的標籤不再是"index"啦~ indices: - index: "tomcat-access-%{[agent.version]}-%{+yyyy.MM.dd}" when.contains: tags: "tomcat-access"setup.ilm.enabled: false# 定義模板名稱.setup.template.name: "tomcat"# 定義模板的匹配索引名稱.setup.template.pattern: "tomcat-*"# 指定索引模板的分片資訊setup.template.settings: index.number_of_shards: 3 index.number_of_replicas: 0[root@oldboy-es03 ~]#
收集錯誤日誌
vim ~/conf/project/tomcat/03.tomcat-to-es.yaml filebeat.inputs:- type: log paths: - /oldboyedu/softwares/tomcat/logs/tomcat.oldboyedu.com_access_log.*.txt json.keys_under_root: true tags: "tomcat-access"- type: log paths: - /oldboyedu/softwares/tomcat/logs/catalina* tags: "tomcat-error" multiline.type: pattern multiline.pattern: '^\d{2}' multiline.negate: true multiline.match: after multiline.max_lines: 1000output.elasticsearch: hosts: ["192.168.56.130:9200","192.168.56.131:9200","192.168.56.132:9200"] indices: - index: "tomcat-access-%{[agent.version]}-%{+yyyy.MM.dd}" when.contains: tags: "tomcat-access" - index: "tomcat-error-%{[agent.version]}-%{+yyyy.MM.dd}" when.contains: tags: "tomcat-error"setup.ilm.enabled: false setup.template.name: "tomcat"setup.template.pattern: "tomcat-*"setup.template.settings: index.number_of_shards: 3 index.number_of_replicas: 0
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952527/viewspace-2921102/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一文搞懂 SAE 日誌採集架構架構
- [技術分享]日誌切割(按天切割日誌)
- 一文搞懂指標採集利器 Telegraf指標
- Kubernetes日誌採集
- 日誌採集/分析
- 日誌採集框架Flume框架
- Kubernetes 叢集日誌管理 - 每天5分鐘玩轉 Docker 容器技術(180)Docker
- 一文帶你搞懂 CDN 的技術原理
- 日誌服務之使用Nginx模式採集日誌Nginx模式
- 日誌服務 HarmonyOS NEXT 日誌採集最佳實踐
- Filebeat 收集日誌的那些事兒
- ELK+FileBeat日誌分析系統
- filebeat 收集nginx日誌輸出到kafkaNginxKafka
- 日誌收集之filebeat使用介紹
- Android 崩潰日誌採集元件-DhccCrashLibAndroid元件
- ELK太重?試試KFC日誌採集
- KubeSphere 多行日誌採集方案深度探索
- 雲集技術學社|帶你瞭解DevOps技術原理dev
- 初體驗!老男孩linux運維班學習心得分享Linux運維
- idou老師教你學Istio :如何用istio實現監控和日誌採集
- 透過 Filebeat 收集 ubuntu 系統日誌Ubuntu
- idou老師教你學Istio 25:如何用istio實現監控和日誌採集
- 日誌分析平臺ELK之日誌收集器filebeat
- 應用日誌採集是什麼意思?批次採集應用日誌軟體用哪個?怎麼操作?應用日誌
- IT小白也能輕鬆get日誌服務---使用Nginx模式採集日誌Nginx模式
- 【學習心得】老男孩Linux課程學習分享,聽聽我的故事!Linux
- Docker筆記(十三):容器日誌採集實踐Docker筆記
- 轉轉容器日誌採集的演進之路
- 在Docker上搭建ELK+Filebeat日誌中心Docker
- ELK+FileBeat+Kafka搭建日誌管理平臺Kafka
- 乾貨分享!帶你瞭解數棧FlinkX實時採集原理與使用
- 帶你掌握Java各種日誌框架Java框架
- Logtail檔案日誌採集之完整正則模式AI模式
- 遊戲日誌分析2:全方位資料採集遊戲
- go-kit 微服務 日誌分析管理 (ELK + Filebeat)Go微服務
- ES & Filebeat 使用 Pipeline 處理日誌中的 @timestamp
- 老J的技術分享之總結
- 一文搞懂 MySQL 日誌MySql