#filebeat #log collect #日志收集 #kafka #caddy

使用 filebeat 收集日志到 kafka

摘要

项目一多,对于各个项目的日志进行收集分析就变得至关重要。代码产生错误,可以及时通知到相关人员,及早得发现问题,解决问题,减少对线上服务产生的影响。

前言

陆陆续续也写了几个项目,已经对一些网站的访问日志作了日志分析用 caddy 搭了自己的短址服务搭建了自己的论坛等等,可参见之前的博文。

这么一些服务在日常维护上还是会很吃力,特别是出了问题不能及时的得到通知,未作出及时的响应,导致的问题扩大化。

这在公司的项目中更能体现,各种服务、各种接口,各种需求。

简介

filebeat 是 elastic 众多开源 beat 中的一个,使用 golang 编写的一个轻量级的日志收集工具,数据可直接传输到 kafkaLogstashElasticsearch 等。

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 集群中
  • 写入的 topiclog-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 这个配置文件,当然如果日志目录未在容器内,还需要挂载进去后重启服务。

Author Mo 最后更新: 2019-04-29 01:00:41