配置filebeat kafka output(multiple topic)踩坑記錄

背景

業務背景

從日誌中收集數據,集中到離線的數據倉庫提供給業務方html

技術背景

離線日誌中心化場景,入庫頻次1次/天,每日生成日誌(即filebeat須要收集的數據)量級爲?,kafka接收到的數據量級爲?,從kafka讀取數據的程序吞吐量爲?併發

需求實現思路

需求解析

需求比較明確,就是要搭建一條日誌中心化(收集)鏈路,只須要知足日頻次的分析需求,因此場景能夠是實時也能夠是離線ide

前期調研

目前業界對於日誌中心化的解決方案通常是elk或者flume+kafka這樣的實時鏈路。考慮filebeat的輕量級和具體的業務場景,採用filebeat -> kafka測試

實施過程

filebeat安裝配置&啓動

裝以前先看了官方refrence的Getting Startedhow filebeat works以及kafka output,大體瞭解一下filebeat的原理、使用方法和filebeat output to kafka的在我組業務場景下的可行性。
按照Getting Started的步驟下載包並配置了filebeat.yml,因爲有對不一樣的log輸出到不一樣的kafka topic的需求,因此又在網上找了一下output to multiple kafka topic的配置,最終的配置文件以下(是錯滴):ui

filebeat.prospectors:
- input_type: log
  paths:
    - /log/1.log*
  include_lines: [‘\[LOG\].+?_MATCH']
  fields:
    topic: topic_1
- input_type: log
  paths:
    - /log/2.log.*
  include_lines: [‘\[LOG\].+?_MATCH']
  fields:
    topic: topic_2
output.kafka:
  hosts: [「broker1:9092", 「broker2:9092", 「broker3:9092"]
  topic: ‘%{[fields.topic]}'
  required_acks: 1

執行./filebeat啓動後遇到了一些問題日誌

遇到的問題

Q1:執行啓動filebeat的命令無日誌
A:加上-e選項(意思是把stderr的內容重定向到stdout),或者在filebeat.yml中配置logging選項)
Q2:從filebeat執行後的console打印來看,配置的log文件時而能夠正常註冊到harvester並收集到spooler發送到kafka,時而一點反應都🈚️。
A:一開始考慮到filebeat會在registry文件中記錄註冊到prospector的文件的status,因此在reference裏面翻翻揀揀找到了兩個配置項(clean_xx),然而並無效果【多是我配錯了】;又試着把文件用mv命令重命名了一下,但仍是不能穩定地讀到我配置的兩個input path(只能讀到其中一個)。
再次翻了一下官方refrence中關於propectors的部分,其中關於fields的解釋是「在最終輸出的文檔中添加一個fields字段」,冥思苦想這個配置:code

  1. 跟區分output到哪一個位置沒有什麼關係
  2. %{[fields.topic]}這種取值方法也未必能取到值【有待驗證】

再次在網上搜了一下output to multiple kafka topic,找到了document_vtype這個配置項,在官方refrence裏面能夠搜索到,含義是「The event type to use for published lines read by harvesters. 」(filebeat裏面的event指的是harvester從log文件中收集併發送新內容給spooler,見https://www.elastic.co/guide/... 第二段第三行),因此它的值應該能夠用在output上。在prospector的官方refrence也能夠看到關於document_type的示例。參考refrence + 這篇blog修改後的配置文件以下:htm

filebeat.prospectors:
- input_type: log
  paths:
    - /log/1.log*
  include_lines: [‘\[LOG\].+?_MATCH']
  document_type: topic1
- input_type: log
  paths:
    - /log/2.log.*
  include_lines: [‘\[LOG\].+?_MATCH']
  document_type: topic2
output.kafka:
  hosts: [「broker1:9092", 「broker2:9092", 「broker3:9092"]
  topic: ‘%{[type]}’
  required_acks: 1

刪掉fielbeats安裝目錄的data目錄下的registry文件,再執行./filebeat -e -c filebeat.yml能夠正常收集blog

關於爲何要刪掉registry文件,能夠參考 how filebeat works。這裏的緣由是我拿來測試的文件一直是同一個,懶得改它的名字。和registry文件中記錄的status相關的prospector配置項還有兩個clean_xx,由於目前尚未找到它的正確配置方法,因此就先直接刪掉registry文件讓filebeat本身從新生成。

遺留問題:

  1. %{[fields.topic]}這種取值方法若是能取到值,那應該第一種配置也能夠
  2. 貌似必須先有kafka consumer,收集到的topic才能正常輸出。若是等filebeat的日誌顯示收集完了再起kafka consumer,則consumer消費不到任何東西,不肯定是否是這個緣由致使的問題2
  3. 生產環境或者其餘不能直接刪除registry的場景下,若是遇到filebeat的下游消費出錯,應該怎樣重放?

Refrences

相關文章
相關標籤/搜索