概述

Elastic Stack推出Beats家族的初衷是弥补Logstash在数据采集方面的一些性能上的不足。

早期ELK技术栈使用Logstash收集并解析日志,但Logstash对内存、cpu、io等资源消耗比较高。如果用它来对服务器进行日志收集,将加重服务器的负载。相比Logstash,Beats所占系统的CPU和内存几乎可以忽略不计,Filebeat作为一个轻量级日志收集处理工具,可用来替代Logstash。

假如有100个节点,每个节点上有10个日志文件需要采集,则需安装100个Logstash,一共要启动1000个数据管道同时写入ES,这样会非常浪费硬件资源,而且ES需要启动大量的线程去应对1000个数据管道日志的同时写入,效率十分低下。

Beats家族成员:

  • Filebeat:日志文件和其他数据采集,从服务器端传送日志文件,完成日志文件数据传输
  • Metricbeat:指标数据采集,服务器监控代理程序,分时段采集服务器上操作系统和服务的各项指标
  • Winlogbeat:Windows事件日志采集
  • Packetbeat:网络数据采集,在应用服务器间传输事务信息的分析器,完成网络数据包传输
  • Auditbeat:审计数据采集
  • Heartbeat:运行状态监测数据采集

在开源社区中,第三方Beats:

  • amazonbeat
  • apachebeat
  • httpbeat
  • mongobeat
  • mysqlbeat
  • redisbeat
  • springbeat
  • twitterbeat
  • udpbeat

架构

ELK技术栈引入Beats有两种方案:

  1. 抛弃Logstash
  2. 保留Logstash

Beats家族的成员采集到的数据可以直接写入ES,不使用Logstash直接将Beats家族采集到的数据写入ES的预处理节点(预处理节点类似于Logstash的过滤器,它可以将采集到的非结构化数据转化为结构化的字段)还可以先进行数据转换再将其写入索引,最后使用Kibana可视化展示采集到的数据。架构如下:

ES系列之Beats及Filebeat实战入门_日志文件


这个架构特别适用于Filebeat自带的模块数据采集,替换掉Logstash使数据的处理流程变得简化,但存在一些缺点:

  • 如果同时写入的Beats节点过多,依然会给ES集群带来不小的写入压力。
  • 使用预处理节点转换数据没有使用Logstash灵活、方便,数据转换功能相对简单。

保留Logstash的ELFK架构如下,各种Beats采集到的数据统一到Logstash:

ES系列之Beats及Filebeat实战入门_数据_02


优点如下:

  • 每个Beats采集数据的吞吐量不一样,Logstash有缓冲队列,把Beats的数据流引入Logstash可以起到数据汇聚和数据缓冲的作用,减少数据流对ES的冲击。
  • Logstash的input插件功能非常丰富,其相比Beats家族能够采集到更多种类的数据。
  • Logstash的数据转换功能比预处理节点的数据转换功能更强大。
  • Logstash的output插件相比Beats家族能支持更多类型的数据输出。

安装

下载并解压,修改默认的配置文件filebeat.yml,找到bin目录下可执行脚本,双击即完成安装。

原理

Filebeat以一种探测并传输的方式工作。程序启动后,将会创建一个或多个探测器(harvester)在特定位置探测日志文件信息并获取日志内容。每一个新发现的日志内容均会被发送给spooler处理程序,该程序将对每一个事件进行聚合,并将聚合之后的数据发送给预先配置好的输出端。

每个Filebeat的配置可以包含一到多个input,可在input中定义数据源的类型以及每个日志文件的路径,采集时Filebeat会为每个日志文件生成一个采集器用于收集新的日志数据。如果需要对采集到的数据进行简易的转换和处理,则可以定义一些处理器进行数据过滤,相当于Logstash的filter,但功能更简单。经过处理器处理的数据流会按照output的配置输出到采集的目的地。

Filebeat运行时,会在安装目录下生成一个data文件夹,里面包含每个日志文件的采集进度数据,每次重启Filebeat时,会读取之前的采集进度数据,并继续采集后面的日志数据。Filebeat采集的数据输出到目的地后会收到相应的确认信息,如果某些数据未得到确认Filebeat会被异常终止,则下次重启Filebeat时,未得到确认的数据会被再次发送,确保每条数据至少能向外传送一次。

配置文件

filebeat.yml包括如下6大模块:

  • inputs:数据源,必选
  • modules:模块,可选
  • template:索引模板,可选
  • setup:连接地址,可选
  • output:输出,必选
  • processors:处理器,可选

filebeat.yml实例:

filebeat.inputs:
- type: log
  paths:
    - /opt/app/JAR_NAME*.log
  fields:
    log_topic: JAR_NAME
  multiline:
    pattern: '^\d{4}-\d{2}-\d{2}'
    negate: true                                # 是否匹配到
    match: after                                # 合并到上一行的末尾
    max_lines: 1000                             # 最大的行数
    timeout: 5s                                # 如果在规定的时候没有新的日志事件就不等待后面的日志
#tail_files: false
#   pattern: '^[[:space:]]'
#   negate: false
#   match: after

processors:
#- drop_fields:
#   fields: :["@timestamp", "input"]
#- decode_json_fields:
- include_fields:
   fields: ["message"] #要进行解析的字段
#   target: ""
#   overwrite_keys: false
#   process_array: false
#   max_depth: 1
output.kafka:
  enabled: true
  hosts: ["kafkalog.aaa.com:9092"]
  topic: JAR_NAME
  partition.round_robin:
    reachable_only: false
  required_acks: 1
  compression: gzip
  max_message_bytes: 1000000
  #topic: '%{[fields.log_topic]}'

实战

输出到Logstash

filebeat.yml配置如下:

output.logstash:
  hosts: ["localhost:5044"]

Logstash启动后会在5044端口(默认端口)监听Filebeat的输入,并接收采集到的日志文本,配置文件filebeat.conf

input {
  beats {
    port => 5044
  }
}
// 省略

输出到ES

filebeat.yml配置:

output.elasticsearch:
  hosts: ["localhost:9200"]

Filebeat的索引模板filebeat.template.json默认存放在/etc/filebeat文件夹中。配置输出数据到ES时,Filebeat在启动时会自动加载默认模板。如果需要加载另一种模板,则需要在filebeat.yml配置文件中修改相关配置:

output.elasticsearch:
  hosts: ["localhost:9200"]
  template.name: "filebeat"                 # 模板名称
  template.path: "filebeat.template.json"   # 模板文件路径
  template.overwrite: false                 # 禁用覆盖,默认为false,不允许将已有的模板覆盖。配置为true启用覆盖功能

采集Nginx日志

Filebeat自带Nginx模块,通过如下命令来启用Nginx模块:
./filebeat modules enable nginx

查看被启用模块的列表
./filebeat modules list

编辑modules.d文件夹下的nginx.yml文件:

- module: nginx
  # Access logs
  access:
    enabled: true
    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    var.paths: ["/usr/local/nginx/logs/access.log"]
  # Error logs
  error:
    enabled: true
    var.paths: ["/usr/local/nginx/logs/error.log"]
  ingress_controller:
    enabled: false

ingress_controller日志是给kubernetes使用的,设置成禁用即可。

编辑filebeat.yml文件

filebeat.config.modules:
  # Glob pattern for configuration loading
  path: ${path.config}/modules.d/*.yml
  # Set to true to enable config reloading
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 1
setup.kibana:
  host: "localhost:5601"
output.elasticsearch:
  hosts: ["localhost:9200"]
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~

执行命令./filebeat setup -e初始化,执行命令./filebeat -e开始采集日志。

进阶

libbeat

官方提供的libbeat运行库,使用Golang编写,所有的Beats工具均使用libbeat提供的API接口,执行传输数据到ES,配置数据的输入,及实现日志记录等任务。

Metricbeat

Metricbeat通过收集数据的方式来监控服务器以及Apache、HAProxy、MongoDB、MySQL、Nginx、PostgreSQL、Redis、System和Zookeeper等服务的运行状况。

metricbeat.yml配置文件:

metricbeat.modules:
-module: system        # 指定模块的名称
metricsets:
    -cpu               # 指定模块中具体要采集的指标
    -filesystem
    -memory
    -network
    -process
  enabled: true        # 指定是否启用该模块
  period:10s           # 指定采集时间间隔
processes: ['.*']      # 指定进程,这里使用通配符,表示所有进程
cpu_ticks: false       # 指定是否采集CPU时钟频率

Winlogbeat

Winlogbeat可以对系统中的新事件进行监视,使用Windows API,从一个或多个事件日志中读取数据,根据用户事先配置好的规则对事件信息进行过滤,然后将事件数据传输至配置好的输出端。每一种事件日志的读取位置信息将被持久化到磁盘中,以便Winlogbeat重新启动后恢复事件日志位置信息。Winlogbeat可以从正在运行的操作系统中捕获任何类型的事件数据,如应用程序事件、硬件事件、安全性事件和系统事件等。

Windows中的事件日志类型可以通过执行如下PowerShell命令来查看:

Get-EventLog *

winlogbeat.yml配置文件:

output.elasticsearch:
  hosts: ["localhost:9200"]
  template.name: "winlogbeat"
  template.path: "winlogbeat.template.json"
  template.overwrite: false

Packetbeat

Packetbeat的主要功能包括捕获应用服务器间网络信息流通量,对应用层的数据(如HTTP,MySQL或Redis等)进行解码,关联请求和响应,以及对每种事务中有价值的输出字段进行记录等。Packetbeat能够嗅探服务器间网络通路,并直接将相关事务信息存入Elasticsearch中,这将有利于用户对网络信息流通量和日志信息进行分析,也便于用户关注后端程序出现的漏洞或性能缺陷,以完成快速修复。

安装Packetbeat前需要安装libpcap0.8:sudo apt-get install libpcap0.8

从Elastic官网获取Packetbeat的DEB格式安装包:curl-L-O https://artifacts.elastic.co/downloads/beats/packetbeat/ packetbeat-8.x.x-amd64.deb

解包并安装Packetbeat:sudo dpkg-i packetbeat-8.x.x-amd64.deb

packetbeat.yml配置文件:

packetbeat.protocols.dns:
ports: [53]
include_authorities: true
include_additionals: true
packetbeat.protocols.http:
ports: [80,8080]
packetbeat.protocols.memcache:
ports: [11211]
packetbeat.protocols.thrift:
ports: [9090]
packetbeat.protocols.cassandra:
ports: [9042]

packetbeat.interfaces.device:指定安装Packetbeat的服务器端向何种设备收发信息。如果需要向任何设备均收发信息,该项可设置为any;如果需要指定特定设备,该项可设置为设备编号,设备编号可以通过在/etc/init.d目录中执行终端命令sudo packetbeat.sh-devices查询设备列表来获取。

参考

  • Elasticsearch数据搜索与分析实战