【老男孩Linux技術分享】5分鐘帶你搞懂日誌採集利器Filebeat!

老男孩IT教育機構發表於2022-10-31

  filebeat是用於" 轉發"和" 集中日誌資料"的輕量級資料採集器。

  filebeat會監視指定的日誌檔案路徑,收集日誌事件並將資料轉發到elasticsearch,logstash,redis,kafka儲存伺服器。

  當您要面對成百上千,甚至成千上萬的伺服器,虛擬機器的容器生成的日誌時,請告別SSH吧。

  Filebeat將為您提供一種輕量級方法,用於轉發和彙總日誌與檔案,讓簡單的事情不再繁雜。

Linux培訓

   | 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 &quot;%r&quot; %s %b" />--><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
            prefix="tomcat.oldboyedu.com_access_log" suffix=".txt"pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authentica
ted&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;request&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}"/>...# 配置主機解析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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章