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(数据传输)+应用程序(处理,存储,展示)
本文地址:https://blog.csdn.net/strggle_bin/article/details/110478888