filebeat 入门

filebeat 入门

Filebeat简介

Filebeat是一个用于转发和聚集日志数据的轻量搬运工。filebeat是以agent的形式安装在我们服务器上,监听日志文件的变化、收集日志事件、然后转发他们到logstash或者elasticsearch上面用于检索。

下面是filebeat的工作原理:当我们启用filebeat,它起于我们在配置文件中定义的日志数据的一个或多个input。对于每一个filebeat定位的日志路径,filebeat都会启动一个收割者。每一个收割者读取一个日志文件获取新的内容,然后发送给libbeat,然后libbeat会聚合所有的事件,然后发送聚合过的数据到我们定义的output中。

image

如果我们想要了解更多关于inputs和收割者harvesters的知识,我们可以查看How FIlebeat work 这篇文章。
Filebeat就像音乐中的一个拍子,他是基于libbeat这个框架。更多关于libbeat和如何安装elasticsearch、logstash、kibana可以查看Beats PlatForm Reference 文章。

filebeat和beats的关系

首先filebeat是Beats中的一员。

Beats在是一个轻量级日志采集器,其实Beats家族有6个成员,早期的ELK架构中使用Logstash收集、解析日志,但是Logstash对内存、cpu、io等资源消耗比较高。相比Logstash,Beats所占系统的CPU和内存几乎可以忽略不计。

目前Beats包含六种工具:

  • Packetbeat:网络数据(收集网络流量数据)
  • Packetbeat:网络数据(收集网络流量数据)
  • Metricbeat:指标(收集系统、进程和文件系统级别的CPU和内存使用情况等数据)
  • Filebeat:日志文件(收集文件数据)
  • Winlogbeat:windows事件日志(收集Windows事件日志数据)
  • Auditbeat:审计数据(收集审计日志)
  • Heartbeat:运行时间监控(收集系统运行时的数据)

filebeat与logstash的关系

因为logstash是jvm跑的,资源消耗比较大,所以后来作者又用golang写了一个功能较少但是资源消耗也小的轻量级的logstash-forwarder。不过作者只是一个人,加入http://elastic.co公司以后,因为es公司本身还收购了另一个开源项目packetbeat,而这个项目专门就是用golang的,有整个团队,所以es公司干脆把logstash-forwarder的开发工作也合并到同一个golang团队来搞,于是新的项目就叫filebeat了。

filebeat组件组成

Filebeat由两个主要组件组成:prospectors 和 harvesters。这两个组件协同工作将文件变动发送到指定的输出中。

Harvester收割者

Harvester(收割机):负责读取单个文件内容。每个文件会启动一个Harvester,每个Harvester会逐行读取各个文件,并将文件内容发送到制定输出中。Harvester负责打开和关闭文件,意味在Harvester运行的时候,文件描述符处于打开状态,如果文件在收集中被重命名或者被删除,Filebeat会继续读取此文件。所以在Harvester关闭之前,磁盘不会被释放。默认情况filebeat会保持文件打开的状态,直到达到close_inactive。

Prospector勘测者

filebeat.prospectors:
- input_type: log
  paths:
    - /apps/logs/*/info.log

Prospector(勘测者):负责管理Harvester并找到所有读取源。
Prospector会找到/apps/logs/*目录下的所有info.log文件,并为每个文件启动一个Harvester。Prospector会检查每个文件,看Harvester是否已经启动,是否需要启动,或者文件是否可以忽略。若Harvester关闭,只有在文件大小发生变化的时候Prospector才会执行检查。只能检测本地的文件。

Filebeat怎么工作的

Filebeat如何记录文件状态:

将文件状态记录在文件中(默认在/var/lib/filebeat/registry)。此状态可以记住Harvester收集文件的偏移量。若连接不上输出设备,如ES等,filebeat会记录发送前的最后一行,并再可以连接的时候继续发送。Filebeat在运行的时候,Prospector状态会被记录在内存中。Filebeat重启的时候,利用registry记录的状态来进行重建,用来还原到重启之前的状态。每个Prospector会为每个找到的文件记录一个状态,对于每个文件,Filebeat存储唯一标识符以检测文件是否先前被收集。

Filebeat如何保证事件至少被输出一次

Filebeat之所以能保证事件至少被传递到配置的输出一次,没有数据丢失,是因为filebeat将每个事件的传递状态保存在文件中。在未得到输出方确认时,filebeat会尝试一直发送,直到得到回应。若filebeat在传输过程中被关闭,则不会再关闭之前确认所有时事件。任何在filebeat关闭之前为确认的时间,都会在filebeat重启之后重新发送。这可确保至少发送一次,但有可能会重复。可通过设置shutdown_timeout 参数来设置关闭之前的等待事件回应的时间(默认禁用)。

filebeat安装

rpm安装

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.2.0-x86_64.rpm
rpm -ivh filebeat-7.2.0-x86_64.rpm
systemctl enable filebeat

docker安装

docker pull docker.elastic.co/beats/filebeat:6.4.2

配置Filebeat

参考地址: https://www.yuque.com/stonejin/cbt4vt/bm92g2

Filebeat modules提供了常见日志格式的方法。如果你想要使用Filebeat module,那么可以跳过这个章节,可以直接跳到:Quick Start: module for common log formats

实例模板

vim /etc/filebeat/filebeat.yml
#引用模块
filebeat.modules:
#调用的nginx的模块
#filebeat modules enable apache mysql;也可以通过这命令加载nginx和mysql的模块
#filebeat  modules list;罗列可以加载的模块
- module: nginx 
  access:
    #设置nginx模块的默认变量,指定读取日志的路径
    #filebeat -e -M "nginx.access.var.paths=[/usr/local/var/log/nginx/access.log*]";也可以直接在外面指定路径直接运行
    var.paths: ["/var/log/ecs/*.log*"] 
  #每个模块启动一个filebeat输入,高级用户可以添加或重写输入设置
  input: 
    #-M "nginx.access.input.close_eof=true";或者可以执行命令打开
    #-M "*.*.input.close_eof=true"
    close_eof: true
#日志读取,type是log,除了log还有Stdin,Container,Redis,Udp,Tcp,Syslog,Docker,Syslog,NteFlow
#详细配置可以参考官网:https://www.elastic.co/guide/en/beats/filebeat/7.2/configuration-filebeat-options.html


#日志输入
filebeat.inputs:  
- type: log    
  enabled: true
  paths:
    - /var/log/ecs/*.log
  #筛选排除以DBG开头的行
  exclude_lines: ['^DBG'] 
  #忽略以gz结尾的文件
  exclude_files: ['\.gz$']
  #只筛选出以ERR和WARN开头的行
  include_lines: ['^ERR', '^WARN']
#从apache2目录中的每个文件中提取行,并使用fields配置选项向输出中添加一个名为apache的字段
- type: log 
  paths:
    - "/var/log/apache2/*"
  fields:
    apache: true
  fields_under_root: true 
#Filebeat在每个发布事件的标记字段中包含的标记列表。标签使得在Kibana中选择特定事件
#或在Logstash中应用条件过滤变得容易。这些标记将被追加到常规配置中指定的标记列表中
- type: log 
  tags: ["json"]


#日志输出
#当为输出指定Elasticsearch时,Filebeat通过使用Elasticsearch HTTP API直接将事务发送给Elasticsearch
output.elasticsearch:
  hosts: ["https://localhost:9200"]
  index: "filebeat-%{[agent.version]}-%{+yyyy.MM.dd}"
  ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
  ssl.certificate: "/etc/pki/client/cert.pem"
#要启用SSL,只需将https添加到主机下定义的所有url。
output.elasticsearch:
  hosts: ["https://localhost:9200"]
  username: "filebeat_internal"
  password: "YOUR_PASSWORD"
  ssl.key: "/etc/pki/client/cert.key"
#如果Elasticsearch节点是由IP:PORT定义的,那么在yaml文件中添加protocol: https
output.elasticsearch:
  hosts: ["localhost"]
  protocol: "https"
  username: "filebeat_internal"
  password: "YOUR_PASSWORD"
#要连接到的Elasticsearch节点列表。事件按轮循顺序分布到这些节点。当某个节点不可达时,
#该事件会自动发送到其他节点。每个Elasticsearch节点可以定义为一个URL或IP:PORT。
#例如:http://192.15.3.2、https://es.found.io:9230或192.24.3.2:9300。如果不指定端口,则使用9200。
output.elasticsearch:
  hosts: ["10.45.3.2:9220", "10.45.3.1:9230"]
  protocol: https
  path: /elasticsearch
#通过使用格式字符串来访问任何事件字段,可以动态地设置索引。
#例如,这个配置使用一个自定义字段fields.log_type来设置索引:
output.elasticsearch:
  hosts: ["http://localhost:9200"]
  index: "%{[fields.log_type]}-%{[agent.version]}-%{+yyyy.MM.dd}" 

posted @ 2022-03-09 17:39  liwenchao1995  阅读(471)  评论(0编辑  收藏  举报