使用ELK收集nginx的正确和错误日志信息

文章目录

  • 前言
    • 使用ELK收集nginx的架构图
    • 在192.168.10.8主机安装kibana
    • 在192.168.10.4主机安装nginx和filebeat
    • nginx日志转换JSON格式
    • 自定义索引
    • access.log和error.log分开收集

前言

ELK理论点和群集的构建在前面的文章里写详细的写过,有意者可以参考 :
https://blog.csdn.net/weixin_43815140/article/details/106263311

使用ELK收集nginx的架构图

使用ELK收集nginx的正确和错误日志信息_第1张图片
这是最原始的一种ELK日志收集架构图,因为logstash消耗资源比较大,所以经常使用filebeat来代替logstash安装在被收集端来收集日志

所需环境:
es和kibana都会很吃内存资源,所以安装在一起时最低配置内存要给2g

主机服务 IP 描述
elasticsearch,kibana 192.168.10.8 存储和展示都放在一台主机,并且做es群集
elasticsearch,nginx,filebeat 192.168.10.4 filebeat收集nginx日志信息,es做群集

安装搭建es群集过程参考上一篇博文
还有提前在清华源把所需的软件下载好,就不插入链接了

在192.168.10.8主机安装kibana

(1)安装kibana

cd /data/soft
rpm -ivh kibana-6.6.0-x86_64.rpm 

(2)修改配置文件
vim /etc/kibana/kibana.yml
修改为:

server.port: 5601
server.host: "192.168.10.8"
server.name: "db01"
elasticsearch.hosts: ["http://192.168.10.8:9200"]
保存退出

(3)启动kibana

systemctl start kibana

在192.168.10.4主机安装nginx和filebeat

1.安装filebeat

cd /data/soft
rpm -ivh filebeat-6.6.0-x86_64.rpm 

2.修改配置文件

filebeat和logstash工作原理一样,都分为input和output
input定义的是收集日志的路径
output定义的是传输给谁,可以是es,也可以是logstash,过滤完在发送到es

vim /etc/filebeat/filebeat.yml

保留这几行就:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log

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

3.启动filebeat

systemctl start filebeat

安装nignx服务器

下载阿里云的epel源

 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

安装nignx

yum -y install nginx
systemctl start nginx

在192.168.10.8端下载ab测试命令工具

yum -y install httpd-tools

使用ab命令测试
ab -n 100 -c 100 http://192.168.10.8/

在es端查看filebeat索引和数据
默认开启的是3分片
使用ELK收集nginx的正确和错误日志信息_第2张图片
5.x版本以后会有索引提示,复制就ok
使用ELK收集nginx的正确和错误日志信息_第3张图片
选择第一个
使用ELK收集nginx的正确和错误日志信息_第4张图片
使用ELK收集nginx的正确和错误日志信息_第5张图片
这是我们nginx默认的日志格式,看起来就是一大串内容
为了方便我i们自己管理,开启日志的JSON格式

nginx日志转换JSON格式

什么是JSON格式?
简单的说就是键值对对应关系,简单明了,一目了然
nginx配置文件默认支持JSO格式日志
需添加:

 log_format log_json '{ "@timestamp": "$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",'
'"up_resp_time": "$upstream_response_time",'
'"request_time": "$request_time"'
' }';

添加的这些项在kibana里面都会有显示,筛选的时候我们也都可以从这些里面筛选
最后要记得更改
access_log /var/log/nginx/access.log log_json;

保存退出,重启nginx服务

使用ELK收集nginx的正确和错误日志信息_第6张图片
还没有完,还需要修改filebeat配置文件添加JSON支持
添加:
json.keys_under_root: true
json.overwrite_keys: true

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true
  json.overwrite_keys: true

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

手动清除刚才产生的索引和kibana里面的信息
再次ab测试
观察message内容
使用ELK收集nginx的正确和错误日志信息_第7张图片

在上面我们看出默认日志做的索引是一天一个索引且kibana 里面自带查询项特别多,
很多几乎都是用不到;时间一长,我们筛选起来也会麻烦;
所以,我们来自定义索引项并修改索引单位从天 改成 月;

自定义索引

在这里,我们要搞清楚关系,如果想实现上面的期望,我们需要修改的是filebeat文件,es只负责接收发过来的日志,kibana更是掺和不到,通过web显示而已
修改filebeat文件配置,主要修改输出项改为月份并且添加json覆盖原来的模板

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true
  json.overwrite_keys: true

output.elasticsearch:
  hosts: ["192.168.10.8:9200"]
  index: "nginx-%{[beat.version]}-%{+yyyy.MM}"
setup.template.name: "nginx"
setup.template.patten: "nginx-*"
setup.template.enabled: false
setup.template.overwrite: true

重启filebeat,手动清理原来的索引,重新ab测试

[root@es-kibana ~]# ab -c 100 -n 100 http://192.168.10.4/

使用ELK收集nginx的正确和错误日志信息_第8张图片
现在,修改完成
但是,在一个日志同时出现了access日志和error日志
使用ELK收集nginx的正确和错误日志信息_第9张图片

access.log和error.log分开收集

再次修改filebeat文件

filebeat.inputs:
- type: log
 enabled: true
 paths:
   - /var/log/nginx/access.log
 tags: ["access"]
 json.keys_under_root: true
 json.overwrite_keys: true
 
- type: log
 enabled: true
 paths:
   - /var/log/nginx/error.log
 tags: ["error"]

output.elasticsearch:
 hosts: ["192.168.10.8:9200"]
 #index: "nginx-%{[beat.version]}-%{+yyyy.MM}"
 indices:
   - index: "nginx-access-%{[beat.version]}-%{+yyyy.MM}"
     when.contains:
       tags: "access"
   - index: "nginx-error-%{[beat.version]}-%{+yyyy.MM}"
     when.contains:
       tags: "error"

setup.template.name: "nginx"
setup.template.patten: "nginx-*"
setup.template.enabled: false
setup.template.overwrite: true

ab测试分别正确访问和错误访问
结果如下
使用ELK收集nginx的正确和错误日志信息_第10张图片
使用ELK收集nginx的正确和错误日志信息_第11张图片
到这里就结束了
配置比较简单,但注意filebeat的配置文件格式,注意空字符的缩进

你可能感兴趣的:(ELK,ELK)