04 . Filebeat簡介原理及配置文件和一些案例

簡介

Beats輕量型數據採集器

Beats 平台集合了多種單一用途數據採集器。它們從成百上千或成千上萬台機器和系統向 Logstash 或 Elasticsearch 發送數據。

Beats系列

全品類採集器,搞定所有數據類型

Beats 可以直接將數據發送到 Elasticsearch 或通過 Logstash,在Kibana 中可視化之前,可以進一步處理和增強數據。

平時我們在查看日誌時,使用 tail -f xxx.log 命令來實時查看日誌,而當我們要面對成百上千、甚至成千上萬的伺服器、虛擬機和容器生成的日誌時,再使用上面的命令來操作幾乎是完全不可能的。Filebeat 為我們提供一種輕量型方法,用於轉發和匯總日誌與文件,讓簡單的事情不再繁雜。

Filebeat 內置有多種模組(Apache、Cisco ASA、Microsoft Azure、Nginx、MySQL 等等),可針對常見格式的日誌大大簡化收集、解析和可視化過程,只需一條命令即可。之所以能實現這一點,是因為它將自動默認路徑(因作業系統而異)與 Elasticsearch 採集節點管道的定義和 Kibana 儀錶板組合在一起。

Filebaet工作原理

無論在任何環境中,隨時都潛伏著應用程式中斷的風險。Filebeat 能夠讀取並轉發日誌行,如果出現中斷,還會在一切恢復正常後,從中斷前停止的位置繼續開始。

Filebeat由兩個主要組件組成: Prospector(收割者) 和 Harvester(勘探者)。

# Harvester
# 負責讀取單個文件的內容
# 如果文件在讀取時被刪除或重命名,Filebeat 將繼續讀取文件

# Prospector
# Prospector 負責管理 Harvester 並找到所有要讀取的文件來源
# 如果輸入類型為日誌,則查找器將查找路徑匹配的所有文件,並為每個文件啟動一個 Harvester。
# Filebeat 目前支援兩種 Prospector 類型: log 和 stdin


# Filebeat 如何保持文件的狀態
# Filebeat 保存每個文件的狀態並經常將狀態刷新到磁碟上的註冊文件中。
# 該狀態用於記住 Harvester 正在讀取的最後偏移量,並確保發送所有日誌行。 
# 如果輸出(例如 Elasticsearch 或 Logstash )無法訪問,Filebeat 會跟蹤最後發送的行,並在輸出再次可用 時繼續讀取文件。
# 在 Filebeat 運行時,每個 Prospector 記憶體中也會保存的文件狀態資訊,當重新啟動 Filebeat 時,
# 將使用註冊文件的數據來重建文件狀態,Filebeat 將每個 Harvester 在從保存的最後偏移量繼續讀取。
# 文件狀態記錄在 data/registry 文件中。

配置詳解

input配置段
#每一個prospectors,起始於一個破折號」-「
filebeat.prospectors:

#默認log,從日誌文件讀取每一行。stdin,從標準輸入讀取
- input_type: log

#日誌文件路徑列表,可用通配符,不遞歸
paths:     - /var/log/*.log

#編碼,默認無,plain(不驗證或者改變任何輸入), latin1, utf-8, utf-16be-bom, utf-16be, utf-16le, big5, gb18030, gbk, hz-gb-2312, euc-kr, euc-jp, iso-2022-jp, shift-jis
encoding: plain

#匹配行,後接一個正則表達式列表,默認無,如果啟用,則filebeat只輸出匹配行,如果同時指定了多行匹配,仍會按照include_lines做過濾
include_lines: [『^ERR』, 『^WARN』]

#排除行,後接一個正則表達式的列表,默認無
#排除文件,後接一個正則表達式的列表,默認無
exclude_lines: [「^DBG」]

#排除更改時間超過定義的文件,時間字元串可以用2h表示2小時,5m表示5分鐘,默認0
ignore_older: 5m

#該type會被添加到type欄位,對於輸出到ES來說,這個輸入時的type欄位會被存儲,默認log
document_type: log

#prospector掃描新文件的時間間隔,默認10秒
scan_frequency: 10s

#單文件最大收集的位元組數,單文件超過此位元組數後的位元組將被丟棄,默認10MB,需要增大,保持與日誌輸出配置的單文件最大值一致即可
max_bytes: 10485760

#多行匹配模式,後接正則表達式,默認無
multiline.pattern: ^[

#多行匹配模式後配置的模式是否取反,默認false
multiline.negate: false

#定義多行內容被添加到模式匹配行之後還是之前,默認無,可以被設置為after或者before
multiline.match: after

#單一多行匹配聚合的最大行數,超過定義行數後的行會被丟棄,默認500
multiline.max_lines: 500

#多行匹配超時時間,超過超時時間後的當前多行匹配事件將停止並發送,然後開始一個新的多行匹配事件,默認5秒
multiline.timeout: 5s

#可以配置為true和false。配置為true時,filebeat將從新文件的最後位置開始讀取,如果配合日誌輪循使用,新文件的第一行將被跳過
tail_files: false

#當文件被重命名或被輪詢時關閉重命名的文件處理。注意:潛在的數據丟失。請務必閱讀並理解此選項的文檔。默認false
close_renamed: false

#如果文件不存在,立即關閉文件處理。如果後面文件又出現了,會在scan_frequency之後繼續從最後一個已知position處開始收集,默認true
close_removed: true

#每個prospectors的開關,默認true
enabled: true

#後台事件計數閾值,超過後強制發送,默認2048
filebeat.spool_size: 2048

#後台刷新超時時間,超過定義時間後強制發送,不管spool_size是否達到,默認5秒
filebeat.idle_timeout: 5s

#註冊表文件,同logstash的sincedb,記錄日誌文件資訊,如果使用相對路徑,則意味著相對於日誌數據的路徑
filebeat.registry_file: ${path.data}/registry

#定義filebeat配置文件目錄,必須指定一個不同於filebeat主配置文件所在的目錄,目錄中所有配置文件中的全局配置會被忽略
filebeat.config_dir
通用配置段
#配置發送者名稱,如果不配置則使用hostname
name:

#標記tag,可用於分組
tags: [「service-X」, 「web-tier」]

#添加附件欄位,可以使values,arrays,dictionaries或者任何嵌套數據
fields:

#處理管道中單個事件內的隊列大小,默認1000
queue_size: 1000

#設置最大CPU數,默認為CPU核數
max_procs:
Output.elasticsearch
#啟用模組
enabled: true

#ES地址
hosts: [「localhost:9200」]

#gzip壓縮級別,默認0,不壓縮,壓縮耗CPU
compression_level: 0

#每個ES的worker數,默認1
worker: 1

#可選配置,ES索引名稱,默認filebeat-%{+yyyy.MM.dd}
index: 「filebeat-%{+yyyy.MM.dd}」

#可選配置,輸出到ES接收節點的pipeline,默認無
pipeline: 「」

#可選的,HTTP路徑,默認無
path: 「/elasticsearch」

#http代理伺服器地址,默認無
proxy_url: //proxy:3128

#ES重試次數,默認3次,超過3次後,當前事件將被丟棄
max_retries: 3

#對一個單獨的ES批量API索引請求的最大事件數,默認50
bulk_max_size: 50

#到ES的http請求超時時間,默認90秒
timeout: 90
Output.logstash
#啟用模組
enabled: true

#logstash地址
hosts: [「localhost:5044」]

#每個logstash的worker數,默認1
worker: 1

#壓縮級別,默認3
compression_level: 3

#負載均衡開關,在不同的logstash間負載
loadbalance: true

#在處理新的批量期間,非同步發送至logstash的批量次數
pipelining: 0

#可選配置,索引名稱,默認為filebeat
index: 『filebeat』

#socks5代理伺服器地址
proxy_url: socks5://user:password@socks5-server:2233

#使用代理時是否使用本地解析,默認false
proxy_use_local_resolver: false
Output.redis
#啟用模組
enabled: true

#logstash地址
hosts: [「localhost:6379」]

#redis地址,地址為一個列表,如果loadbalance開啟,則負載到里表中的伺服器,當一個redis伺服器不可達,事件將被分發到可到達的redis伺服器
worker: 1

#redis埠,如果hosts內未包含埠資訊,默認6379
port: 6379

#事件發布到redis的list或channel,默認filebeat
key: filebeat

#redis密碼,默認無
password:

#redis的db值,默認0
db: 0

#發布事件使用的redis數據類型,如果為list,使用RPUSH命令(生產消費模式)。如果為channel,使用PUBLISH命令{發布訂閱模式}。默認為list
datatype: list

#為每個redis伺服器啟動的工作進程數,會根據負載均衡配置遞增
worker: 1

#負載均衡,默認開啟
loadbalance: true

#redis連接超時時間,默認5s
timeout: 5s

#filebeat會忽略此設置,並一直重試到全部發送為止,其他beat設置為0即忽略,默認3
max_retries: 3

#對一個redis請求或管道批量的最大事件數,默認2048
bulk_max_size: 2048

#socks5代理地址,必須使用socks5://
proxy_url:

#使用代理時是否使用本地解析,默認false
proxy_use_local_resolver: false

1

Path配置段
filebeat安裝目錄,為其他所有path配置的默認基本路徑,默認為filebeat二進位文件的本地目錄
path.home:

#filebeat配置路徑,主配置文件和es模板的默認基本路徑,默認為filebeat家目錄
path.config: ${path.home}

#filebeat數據存儲路徑,默認在filebeat家目錄下
path.data: ${path.home}/data

#filebeat日誌存儲路徑,默認在filebeat家目錄下
path.logs: ${path.home}/logs
logging配置段
#有3個可配置的filebeat日誌輸出選項:syslog,file,stderr
#windows默認輸出到file

#設定日誌級別,可設置級別有critical, error, warning, info, debug
logging.level: info

#開啟debug輸出的選擇組件,開啟所有選擇使用[「*」],其他可用選擇為」beat」,」publish」,」service」
logging.selectors: [ ]

#輸出所有日誌到syslog,默認為false
logging.to_syslog: true

#定期記錄filebeat內部性能指標,默認true
logging.metrics.enabled: true

#記錄內部性能指標的周期,默認30秒
logging.metrics.period: 30s

#輸出所有日誌到file,默認true
logging.to_files: true

#日誌輸出的文件配置
logging.files:

#配置日誌輸出路徑,默認在家目錄的logs目錄
path: /var/log/filebeat

#filebeat #日誌文件名
name:

#日誌輪循大小,默認10MB
rotateeverybytes: 10485760

#日誌輪循文件保存數量,默認7
keepfiles: 7

常用例子

輸出到kafka集群中
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /home/admin/taobao-tomcat-production-7.0.59.3/logs/catalina.out
  fields:
    local_type: 'tomcat' #這些都是附加的標籤
    local_ip: 1.1.1.1
    local_host: 'prod_商品_1'
  fields_under_root: true #將標籤放到頂頭,不然在message欄位里
  multiline.pattern: '^20' #20開頭和20開頭之間的算作一行,具體根據日誌情況
  multiline.negate: true
  multiline.match: after

filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 3

output.kafka:
  enabled: true
  hosts: ["1.1.1.1:9092","1.1.1.2:9092","1.1.1.3:9092"] #kafka集群地址
  topic: 'tomcat-server-log' #topic名
Output.elasticsearch
#啟用模組
enabled: true

#ES地址
hosts: [「localhost:9200」]

#gzip壓縮級別,默認0,不壓縮,壓縮耗CPU
compression_level: 0

#每個ES的worker數,默認1
worker: 1

#可選配置,ES索引名稱,默認filebeat-%{+yyyy.MM.dd}
index: 「filebeat-%{+yyyy.MM.dd}」

#可選配置,輸出到ES接收節點的pipeline,默認無
pipeline: 「」

#可選的,HTTP路徑,默認無
path: 「/elasticsearch」

#http代理伺服器地址,默認無
proxy_url: //proxy:3128

#ES重試次數,默認3次,超過3次後,當前事件將被丟棄
max_retries: 3

#對一個單獨的ES批量API索引請求的最大事件數,默認50
bulk_max_size: 50

#到ES的http請求超時時間,默認90秒
timeout: 90
Output.logstash
#啟用模組
enabled: true

#logstash地址
hosts: [「localhost:5044」]

#每個logstash的worker數,默認1
worker: 1

#壓縮級別,默認3
compression_level: 3

#負載均衡開關,在不同的logstash間負載
loadbalance: true

#在處理新的批量期間,非同步發送至logstash的批量次數
pipelining: 0

#可選配置,索引名稱,默認為filebeat
index: 『filebeat』

#socks5代理伺服器地址
proxy_url: socks5://user:password@socks5-server:2233

#使用代理時是否使用本地解析,默認false
proxy_use_local_resolver: false
Output.redis
#啟用模組
enabled: true

#logstash地址
hosts: [「localhost:6379」]

#redis地址,地址為一個列表,如果loadbalance開啟,則負載到里表中的伺服器,當一個redis伺服器不可達,事件將被分發到可到達的redis伺服器
worker: 1

#redis埠,如果hosts內未包含埠資訊,默認6379
port: 6379

#事件發布到redis的list或channel,默認filebeat
key: filebeat

#redis密碼,默認無
password:

#redis的db值,默認0
db: 0

#發布事件使用的redis數據類型,如果為list,使用RPUSH命令(生產消費模式)。如果為channel,使用PUBLISH命令{發布訂閱模式}。默認為list
datatype: list

#為每個redis伺服器啟動的工作進程數,會根據負載均衡配置遞增
worker: 1

#負載均衡,默認開啟
loadbalance: true

#redis連接超時時間,默認5s
timeout: 5s

#filebeat會忽略此設置,並一直重試到全部發送為止,其他beat設置為0即忽略,默認3
max_retries: 3

#對一個redis請求或管道批量的最大事件數,默認2048
bulk_max_size: 2048

#socks5代理地址,必須使用socks5://
proxy_url:

#使用代理時是否使用本地解析,默認false
proxy_use_local_resolver: fals

安裝配置

下載安裝
curl -L -O //artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.2-linux-x86_64.tar.gz

# 將下載包解壓到 /usr/local 目錄下
tar xzvf filebeat-7.6.2-linux-x86_64.tar.gz -C /usr/local
配置

監聽stdin 輸入,並輸出到控制台上

filebeat.inputs:
- type: stdin
  enabled: true
output.console:
  pretty: true
  enable: true
啟動執行
cd /usr/local/filebeat-7.6.2-linux-x86_64

./filebeat -e -c filebeat-std.yml

# 參數說明
-e: 輸出到標準輸出,默認輸出到syslog和logs下 
-c: 指定配置文件

收集Nginx配置

讀取配置文件
# 配置讀取日誌文件 filebeat-log.yml
filebeat.inputs: 
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/*.log 
setup.template.settings:
  index.number_of_shards: 3 
output.console:
  pretty: true
  enable: true
啟動執行測試
systemctl start filebeat
filebeat -e -c filebeat-log.yml 

# 參數說明
-e: 輸出到標準輸出,默認輸出到syslog和logs下 
-c: 指定配置文件
  
curl 192.168.43.205
  
{
  "@timestamp": "2020-07-21T01:45:56.008Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.2.0"
  },
  "log": {
    "offset": 95,
    "file": {
      "path": "/var/log/nginx/access.log"
    }
  },
  "message": "192.168.43.176 - - [21/Jul/2020:09:45:52 +0800] \"GET / HTTP/1.1\" 200 612 \"-\" \"curl/7.29.0\" \"-\"",
  "input": {
    "type": "log"
  },
  "ecs": {
    "version": "1.0.0"
  },
  "host": {
    "name": "nginx"
  },
  "agent": {
    "version": "7.2.0",
    "type": "filebeat",
    "ephemeral_id": "bf9cd048-7041-4167-b8a2-46485a5028ec",
    "hostname": "nginx",
    "id": "cf47c715-17f2-48d5-9f10-866f10eba0cf"
  }
}
配置nginx輸出到Elasticsearch
(vim /etc/filebeat/filebeat.yml) shift + : 輸入set nu 顯示行號
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/*.log
    filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true  
24:   enabled:  true                         # 更改為true以啟用輸入配置
28:   - /data/*.log                   # 替換為要抓取的日誌文件路徑,如果抓取nginx日誌,修改為/var/log/nginx/access.log,如果是日誌伺服器,在下面再加上多行其他地方的日誌目錄即可
73:  reload.enabled:  true                  # 啟動Filebeat模組
output.elasticsearch:
  hosts: ["192.168.43.176:9200","192.168.43.205:9200","192.168.43.215:9200"]