filebeat收集nginx日志并转化为json格式日志保存到Elasticsearch

Filebeat 介绍

Filebeat 是使用 Golang 实现的轻量型日志采集器,也是 Elasticsearch stack 里面的一员。本质上是一个 agent ,可以安装在各个节点上,根据配置读取对应位置的日志,并上报到相应的地方去。

Filebeat 的可靠性很强,可以保证日志 At least once 的上报,同时也考虑了日志搜集中的各类问题,例如日志断点续读、文件名更改、日志 Truncated 等。

Filebeat 并不依赖于 ElasticSearch,可以单独存在。我们可以单独使用Filebeat进行日志的上报和搜集。filebeat 内置了常用的 Output 组件, 例如 kafka、ElasticSearch、redis 等,出于调试考虑,也可以输出到 console 和 file 。我们可以利用现有的 Output 组件,将日志进行上报。

当然,我们也可以自定义 Output 组件,让 Filebeat 将日志转发到我们想要的地方。

filebeat 其实是 elastic/beats 的一员,除了 filebeat 外,还有 HeartBeat、PacketBeat。这些 beat 的实现都是基于 libbeat 框架。

Filebeat整体工作原理

Filebeat 由两个主要组件组成:harvester 和 prospector。

采集器 harvester 的主要职责是读取单个文件的内容。读取每个文件,并将内容发送到 the output。 每个文件启动一个 harvester,harvester 负责打开和关闭文件,这意味着在运行时文件描述符保持打开状态。如果文件在读取时被删除或重命名,Filebeat 将继续读取文件。

查找器 prospector 的主要职责是管理 harvester 并找到所有要读取的文件来源。如果输入类型为日志,则查找器将查找路径匹配的所有文件,并为每个文件启动一个 harvester。每个 prospector 都在自己的 Go 协程中运行。

注:Filebeat prospector只能读取本地文件, 没有功能可以连接到远程主机来读取存储的文件或日志。

由以上两个组件一起工作来读取文件(tail file)并将事件数据发送到您指定的输出。

直接开始实验

本次实验需要用到的elasticeseach和kibana,我的上一条博客已经介绍过详细的安装过程了,可以去参考
elasticeseach和kibana的详细安装
为了测试就不用/etc/filebeat/filebeat.yml配置文件的了
直接自己写一个文件,等下运行的时候指定就可以了

[root@server156 ~]# vim /root/nginx_json_log.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/www.access.log
  tags: "access"
  json.keys_under_root: false
  json.overwrite_keys: true
  json.add_error_key: true
  json.message_key: json-err
setup.template.settings:
  index.number_of_shards: 3
  index.number_of_replicas: 0
#如果es索引模板已经存在,我们要修改 主副分片数 必须覆盖原来的模块
setup.template.overwrite: true
#设置自定义索引模块
setup.template.name: "nginx-log"
setup.template.pattern: "nginx-log-*"

output.elasticsearch:
  hosts: ["http://192.168.121.156:9200"]
  ilm.enabled: false
  indices:
    - index: "nginx-log-access-host156-%{+yyyy.MM}"
      when.contains:
        tags: "access"

写好yaml文件以后就可以去配置nginx的日志格式了
记得等下nginx的日志文件路径要对应上
有nginx的就直接设置
我这台机器上没有,yum下载一个比较方便

yum install nginx -y

修改nginx日志格式,先将原来的日志模板注释掉,然后再添加自己想要的格式
这个可以看自己的需求来配

[root@server156 ~]# vim /etc/nginx/nginx.conf

#    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                      '$status $body_bytes_sent "$http_referer" '
#                      '"$http_user_agent" "$http_x_forwarded_for"';
    log_format  main   '{"remote_addr":"$remote_addr","remote_user":"$remote_user",'
                       '"time_local":"$time_local","request":"$request","status":"$status",'
                       '"body_size":"$body_bytes_sent","referer":"$http_referer","agent":"$http_user_agent",'
                       '"x_forwarded":"$http_x_forwarded_for"}';

为了区别原来默认的日志文件,我修改了日志文件名

access_log  /var/log/nginx/www.access.log  main;

然后启动nginx

[root@server156 ~]# systemctl start nginx

然后在浏览器或者其它主机访问这台主机,查看日志

[root@server156 elasticsearch-head-master]# cd
[root@server156 ~]# cat /var/log/nginx/www.access.log 
{"remote_addr":"192.168.121.155","remote_user":"-","time_local":"11/Oct/2023:11:01:33 +0800","request":"GET / HTTP/1.1","status":"200","body_size":"4833","referer":"-","agent":"curl/7.29.0","x_forwarded":"-"}
{"remote_addr":"192.168.121.155","remote_user":"-","time_local":"11/Oct/2023:11:01:34 +0800","request":"GET / HTTP/1.1","status":"200","body_size":"4833","referer":"-","agent":"curl/7.29.0","x_forwarded":"-"}
{"remote_addr":"192.168.121.155","remote_user":"-","time_local":"11/Oct/2023:11:01:35 +0800","request":"GET / HTTP/1.1","status":"200","body_size":"4833","referer":"-","agent":"curl/7.29.0","x_forwarded":"-"}
{"remote_addr":"192.168.121.155","remote_user":"-","time_local":"11/Oct/2023:11:01:35 +0800","request":"GET / HTTP/1.1","status":"200","body_size":"4833","referer":"-","agent":"curl/7.29.0","x_forwarded":"-"}

日志已经是我们修改后的模板了
然后启动filebeat收集日志到elasticeseach

[root@server156 ~]# filebeat -e -c /root/nginx_json_log.yml

然后就去kibana的5601端口查看信息
filebeat收集nginx日志并转化为json格式日志保存到Elasticsearch_第1张图片
可以看到我们的日志的索引已经收集到了
然后在kibana创建索引模式查看我们的数据
kibana的详细安装在我的上一条博客里已经有写了,还没安装的话可以去看看
filebeat收集nginx日志并转化为json格式日志保存到Elasticsearch_第2张图片
filebeat收集nginx日志并转化为json格式日志保存到Elasticsearch_第3张图片
创建后以后就可以去看我们的数据了
filebeat收集nginx日志并转化为json格式日志保存到Elasticsearch_第4张图片
可以看到我们的日志信息已经转为json格式了,json前缀的就是我们的日志字段

你可能感兴趣的:(日志收集系统,nginx,json,elasticsearch,运维)