使用 filebeat 收集日志到 kafka
摘要
项目一多,对于各个项目的日志进行收集分析就变得至关重要。代码产生错误,可以及时通知到相关人员,及早得发现问题,解决问题,减少对线上服务产生的影响。前言
陆陆续续也写了几个项目,已经对一些网站的访问日志作了日志分析,用 caddy 搭了自己的短址服务,搭建了自己的论坛等等,可参见之前的博文。
这么一些服务在日常维护上还是会很吃力,特别是出了问题不能及时的得到通知,未作出及时的响应,导致的问题扩大化。
这在公司的项目中更能体现,各种服务、各种接口,各种需求。
简介
filebeat 是 elastic 众多开源 beat 中的一个,使用 golang
编写的一个轻量级的日志收集工具,数据可直接传输到 kafka
、Logstash
、Elasticsearch
等。
Filebeat 内置有多种模块(auditd、Apache、NGINX、System、MySQL 等等),可针对常见格式的日志大大简化收集、解析和可视化过程,只需一条命令即可。之所以能实现这一点,是因为它将自动默认路径(因操作系统而异)与 Elasticsearch 采集节点管道的定义和 Kibana 仪表板组合在一起。不仅如此,数个 Filebeat 模块还包括预配置的 Machine Learning 任务。
下载及安装
官方已提供多种下载安装的方式,本示例使用 Docker
的方式进行安装及使用。
还没有安装 docker
? 可以查看这个简介:《在 CentOS 上安装 Docker》
使用 Docker
的方式来启动,只需关注 Dockerfile
的编写,对于团队中有不需要关注运行原理的伙伴,这是一种较好的协同方式,只要写一点对于容器的解释就可以。
官方也提供在 kubernetes
中运行,有需要的可以查看这里。
自定义配置
使用自定义的 Dockerfile
:
FROM docker.elastic.co/beats/filebeat:6.7.1
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
USER root
RUN chown root:filebeat /usr/share/filebeat/filebeat.yml; \
chmod go-w /usr/share/filebeat/filebeat.yml
USER filebeat
由于 filebeat
收集日志依赖于 filebeat.yml
这个配置文件,使用时把这个配置挂到容器外,方便管理收集的内容。注意:修改完配置不需要重启服务,filebeat
会自动监测配置文件的变更。
配置自己的 filebeat.yml
:
filebeat.inputs:
- type: log
enabled: true
paths:
- /logs/*/*
exclude_files: ['access.log', 'access-.*.log']
close_inactive: 6m
output.kafka:
enabled: true
hosts: ["you-kafka-host:9092"]
topic: log-collect
以上配置可实现如下功能:
- 收集容器内
/logs
日志下所有目录中的所有文件,注:/logs
日志下的文件并不收集。 - 不包含路径中含有
access.log
或被正则access-.*.log
匹配到的文件。 - 6 分钟没有数据,就关闭当前的
- 收集的日志写到
kafka
集群中 - 写入的
topic
是log-collect
其它重要的配置介绍可见文末。
使用 docker-compose
来作容器的管理:
version: '3'
services:
log-collect:
restart: always
build: .
hostname: log-collect
command: -e
volumes:
- /path/to/test-logs:/logs/test-logs
# self
- log-collect-data:/usr/share/filebeat/data
volumes:
log-collect-data:
把当前需要收集日志的目录挂载到容器中即可实现文件的收集。
注意:当前把容器中的 log-collect-data:/usr/share/filebeat/data
挂载出来是为了把每个日志文件收集到的信息(包括日志收集的 offset、收集的哪个文件)挂载到一个数据卷中,防止容器重启后收集的位置丢失导致的重头开始收集。
启动
完成按以上步骤来操作的话,启动异常简单,使用 docker-compose up -d
即可完成 filebeat
服务的启动。
使用二进制命令启动的话,可以使用 filebeat -e
进行启动,当然,前提是已经配置好 filebeat.yml
。
由于已经把 /usr/share/filebeat/data
这个日志挂载出来,所以删除容器 docker-compose down -v
之后再启动,依然会收集删除容器之后产生的日志,之前的不会再收集。
想要完全从头部开始,可以使用 docker volume rm log-collect-data
删除此数据卷,之后再启动。
小结
整理来说,filebeat
已经把功能封装很好了,添加新的日志文件只需要修改 filebeat.yml
这个配置文件,当然如果日志目录未在容器内,还需要挂载进去后重启服务。