配置filebeat kafka output(multiple topic)踩坑记录

背景

业务背景

从日志中收集数据,集中到离线的数据仓库提供给业务方

技术背景

离线日志中心化场景,入库频次1次/天,每日生成日志(即filebeat需要收集的数据)量级为?,kafka接收到的数据量级为?,从kafka读取数据的程序吞吐量为?

需求实现思路

需求解析

需求比较明确,就是要搭建一条日志中心化(收集)链路,只需要满足日频次的分析需求,所以场景可以是实时也可以是离线

前期调研

目前业界对于日志中心化的解决方案一般是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的配置,最终的配置文件如下(是错滴):

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字段”,左思右想这个配置:

  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修改后的配置文件如下:

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可以正常收集

关于为什么要删掉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

你可能感兴趣的:(filebeat,kafka)