欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

filebeat(ELK)

程序员文章站 2022-06-19 10:06:35
一、filebeat是什么1.filebeat和beats的关系首先filebeat是Beats中的一员。  Beats在是一个轻量级日志采集器,其实Beats家族有6个成员,早期的ELK架构中使用Logstash收集、解析日志,但是Logstash对内存、cpu、io等资源消耗比较高。相比Logstash,Beats所占系统的CPU和内存几乎可以忽略不计。  目前Beats包含六种工具:Packetbeat:网络数据(收集网络流量数据)Metricbeat:指标(收集系统、进程和文件系统级别...

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配置的输出。
  工作的流程图如下:
filebeat(ELK)

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;

修改如下图
filebeat(ELK)
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 >> 动作 >>删除
filebeat(ELK)
6、重启filebeat
7、登录到kibana 上查看数据
filebeat(ELK)

推荐解决方案

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

本文地址:https://blog.csdn.net/strggle_bin/article/details/110478888

相关标签: ELK