filebeat(ELK)

filebeat是什么

1.filebeat和beats的关系

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

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

2.filebeat是什么

Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash进行索引。
  
  Filebeat的工作方式如下:启动Filebeat时,它将启动一个或多个输入,这些输入将在日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将聚集事件,并将聚集的数据发送到为Filebeat配置的输出。
  工作的流程图如下:
在这里插入图片描述

3.filebeat和logstash的关系

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

filebeat原理

1、filebeat的构成

filebeat结构:由两个组件构成,分别是inputs(输入)和harvesters(收集器),这些组件一起工作来跟踪文件并将事件数据发送到您指定的输出,harvester负责读取单个文件的内容。harvester逐行读取每个文件,并将内容发送到输出。
  每个文件启动一个harvester。harvester负责打开和关闭文件,这意味着文件描述符在harvester运行时保持打开状态。如果在收集文件时删除或重命名文件,Filebeat将继续读取该文件。这样做的副作用是,磁盘上的空间一直保留到harvester关闭。默认情况下,Filebeat保持文件打开,直到达到close_inactive

关闭harvester可以会产生的结果:

文件处理程序关闭,如果harvester仍在读取文件时被删除,则释放底层资源。
只有在scan_frequency结束之后,才会再次启动文件的收集。
如果该文件在harvester关闭时被移动或删除,该文件的收集将不会继续
  一个input负责管理harvesters和寻找所有来源读取。如果input类型是log,则input将查找驱动器上与定义的路径匹配的所有文件,并为每个文件启动一个harvester。每个input在它自己的Go进程中运行,Filebeat当前支持多种输入类型。每个输入类型可以定义多次。日志输入检查每个文件,以查看是否需要启动harvester、是否已经在运行harvester或是否可以忽略该文件

FileBeat安装与启动

Filebeat基于go语言开发无其他依赖,它最大的特点是性能稳定、配置简单、占用系统资源很少,安装使用也非常简单,可访问Elastic-Beats官网获取各版本Filebeat。因为filebeat各版本之间的差异较大,这里推荐7以上的新版,首先进行下载解压:

tar -zxvf filebeat-7.tar.gz
mv filebeat-7 filebeat
cd filebeat

1.FileBeat启停指令:

  • 调试模式下采用:终端启动(退出终端或ctrl+c会退出运行)
    ./filebeat -e -c filebeat.yml
  • 线上环境配合error级别使用:以后台守护进程启动启动filebeats
    nohup ./filebeat -e -c filebeat.yml &
  • 零输出启动(不推荐):将所有标准输出及标准错误输出到/dev/null空设备,即没有任何输出信息。
    nohup ./filebeat -e -c filebeat.yml >/dev/null 2>&1 &
  • 停止运行FileBeat进程
    ps -ef | grep filebeat
    Kill -9 线程号

Filebeat收集nginx的json格式日志

在安装好nginx 之后,默认的日志格式是这样的

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
 
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
 
    access_log  /var/log/nginx/access.log  main;
 
    sendfile        on;
    #tcp_nopush     on;
 
    keepalive_timeout  65;
 
    #gzip  on;
 
    include /etc/nginx/conf.d/*.conf;
}

我们需要把nginx 的日志格式 转换成 json日志格式
1、修改nginx.conf配置文件,在http { } 里新增加如下内容,并且把原先的日志格式注释掉

[root@fxkjnj  / ]# vim /usr/local/nginx/conf/nginx.conf

log_format json '{ "time_local": "$time_local", '
	'"remote_addr": "$remote_addr", '
	'"referer": "$http_referer", '
	'"request": "$request", '
	'"status": $status, '
	'"bytes": $body_bytes_sent, '
	'"agent": "$http_user_agent", '
	'"x_forwarded": "$http_x_forwarded_for", '
	'"up_addr": "$upstream_addr",'
	'"up_host": "$upstream_http_host",'
	'"upstream_time": "$upstream_response_time",'
	'"request_time": "$request_time"'
	' }';

access_log /var/log/nginx/access.log json;

修改如下图
在这里插入图片描述
2、清除日志记录

[root@fxkjnj  / ]#  > /var/log/nginx/access.log

3、检查并重启nginx

[root@fxkjnj  / ]# /usr/local/nginx/sbin/nginx -t
[root@fxkjnj  / ]# /usr/local/nginx/sbin/nginx -s reload

4、通过查看发现,虽然nginx日志变成了json,但是elasticsearch 里还是存储在message里,没有拆分成字段

方式一:

[root@fxkjnj  / ]# vim /usr/local/filebeat-6.6.0-linux-x86_64/filebeat.yml
 
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/access.log
  #keys_under_root可以让字段位于根节点,默认为false
  json.keys_under_root: true
  #对于同名的key,覆盖原有key值
  json.overwrite_keys: true
  #将解析错误的消息记录储存在error.message字段中
  json.add_error_key: true

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

参考的官方文档

https://www.elastic.co/guide/en/beats/filebeat/6.2/configuration-filebeat-options.html

上面的几个配置项,只要配置了任意一项,filebeat就会开启json采集的功能。配置完成后filebeat会和采集正常的日志一样,对path中配置的json文件路径进行采集,然后会将json报文中的字段存储到es中。

方式二:
使用方法一,就将json对象中的每个子字段解析成顶级结构下的一个字段,解析后,保存日志完整内容的message字段(也即完整的json串)消失了。
用processors中的decode_json_fields处理器进行处理,可以保留message字段,它类似logstash中的filter,具体格式如下:

[root@fxkjnj  / ]# vim /usr/local/filebeat-6.6.0-linux-x86_64/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/access_json.log
    
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
  
setup.template.settings:
  index.number_of_shards: 1
  
output.elasticsearch:
  hosts: ["xxx.xx.xx.xx:9200"]
  index: "%{[fields.logType]}-%{+yyyy.MM.dd}"
  
#顶格对齐
setup.template.name: "%{[fields.logType]}"
setup.template.pattern: "%{[fields.logType]}-*"

processors:
    - decode_json_fields:
        fields: ['message'] #要进行解析的字段
        target: "" #json内容解析到指定的字段,如果为空(“”),则解析到顶级结构下
        overwrite_keys: false #如果解析出的json结构中某个字段在原始的event(在filebeat中传输的一条数据为一个event)中也存在,是否覆盖event中该字段的值,默认值:false
        process_array: false #数组是否解码,默认值:false
        max_depth: 1 #解码深度,默认值:1
    - drop_fields: 
       fields: ["message"]  #删除不写入es的字段

5、删除elasticsearch 里之前的索引
es-head >> filebeat-6.6.0-2019.11.15 >> 动作 >>删除
在这里插入图片描述
6、重启filebeat
7、登录到kibana 上查看数据
在这里插入图片描述

推荐解决方案

1、Filebeat(采集数据)+Elasticsearch(建立索引)+Kibana(展示)
2、Filebeat(采集数据)+Logstash(过滤)+Elasticsearch(建立索引)+Kibana(展示)
3、Filebeat(采集数据)+Kafka/Redis/File/Console(数据传输)+应用程序(处理,存储,展示)
4、Filebeat(采集数据)+Logstash(过滤)+Kafka/Redis/File/Console(数据传输)+应用程序(处理,存储,展示)

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页