1.为什么要收集json格式的日志类型
由于nginx普通日志收集过来的日志内容都是存在一个字段中的值,我们想单独对日志中的某一项进行查询统计,比如我只想查看某个IP请求了我那些页面,一共访问了多少次,在普通的日志中是无法过滤的,不是很满意
如下图,可以明显的看出,收集过来的日志信息都是在一块的,不能够根据某一项内容进行查询
因此就需要让filebeat收集json格式日志内容,把日志内容分成不同的字段,也就是Key/value,这样我们就可以根据一个字段去统计这个字段的相关内容了
我们期望日志收集过来是这个样子的
$remote_addr:192.168.81.210
$remote_user:-
[$time_local]:[15/Jan/2021:15:03:39 +0800]
$request:GET /yem HTTP/1.1"
$status:404
$body_bytes_sent:3650
$http_referer: -
$http_user_agent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
$http_x_forwarded_for:-
中文格式更是我们期望的
客户端地址:192.168.81.210
访问时间:[15/Jan/2021:15:03:39 +0800]
请求的页面:GET /yem HTTP/1.1"
状态码:404
传输流量:3650
跳转来源: -
客户端程序:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
客户端外网地址:-
请求响应时间:-
后端地址:-
2.配置nginx支持json格式的日志输出
1.修改主配置文件
[root@logsj ~]# vim /etc/nginx/nginx.conf
http {
log_format main '{"客户端内网地址":"$remote_addr",'
'"时间":"$time_iso8601",'
'"URL":"$request",'
'"状态码":$status,'
'"传输流量":$body_bytes_sent,'
'"跳转来源":"$http_referer",'
'"浏览器":"$http_user_agent",'
'"客户端外网地址":"$http_x_forwarded_for",'
'"请求响应时间":$request_time,'
'"后端地址":"$upstream_addr"}';
}
2.重启
[root@logsj ~]# nginx -t
[root@logsj ~]# systemctl reload nginx
日志已经输出为json格式
3.配置filebeat解析json格式的日志
一定要改filebeat配置文件,使其支持json格式的日志解析,否则写入es索引库的时候还是一串字符串,无法识别每个字段的值
1.在配置文件增加json格式解析配置
[root@logsj ~]# vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
json.keys_under_root: true
json.overwrite_keys: true
output.elasticsearch:
hosts: ["192.168.81.210:9200"]
2.重启filebeat
[root@logsj ~]# systemctl restart filebeat.service
4.清空之前收集的旧格式数据
一定要清空es之前收集的传统日志格式的数据,还要把nginx日志情况,如果有多台nginx服务器,则改完json格式的日志后,一定要把日志清空,否则将会在kibana中显示两种日志格式
4.1.停掉filebeat
停掉filebeat,不再收集日志
[root@logsj ~]# systemctl stop filebeat.service
4.2.删除es日志索引库
kibana展示的数据都是从es库拿过来的,如果es库不删除重建的,也会是两种格式的数据
4.3.删除kibana的日志索引库
kibana上对应es的日志索引库也需要删除,否则新日志进来后,由于是json格式,很多字段会提示感叹号
点击Managerment—索引模式—索引库—删除
5.配置filebeat指定索引库名称
filebeat每次自动创建的索引都是filebeat-xxx,对应我们生产环境来说不太友好,我们可以自定义索引名称
1.修改配置文件
[root@logsj ~]# vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
fields: #类似于标签
index: nginx
json.keys_under_root: true
json.overwrite_keys: true
output.elasticsearch:
hosts: ["192.168.81.210:9200"]
indices: #定义索引名
- index: "elk-nginx-%{+yyyy.MM.dd}"
when.equals: #与那个标签关联
fields:
index: "nginx"
2.重启
[root@logsj ~]# systemctl restart filebeat
6.kibana创建日志索引库
全部删除完成后就可以启动filebeat并在kibana上创建索引库,展示json格式的日志了
刚才es上的索引库已经建立了,下面去kibana上建立同名的索引进行关联调用,也类似于软连接的效果
点击Managerment—创建索引—索引名称使用通配符形式,与es上的索引进行关联
填写索引名elk-nginx-*之后会列出es上elk-nginx开头的索引库并进行关联
字段选择@timestamp
创建完成
查看json格式收集来的日志数据,已经将每一项内容变成了一个字段值便于查询
7.使用kibana统计json格式的日志
7.1.统计客户端地址为192.168.81.210访问了多少次页面
7.1.1.找到客户端内网地址的字段点击添加
找到下面的客户端内网地址的字段点击ADD即可添加
7.1.2.添加一个筛选器筛选指定的客户端地址
7.1.3.查看数据
点击完保存后即可查询,右上角可以看到总数,中间可以看到具体的日志信息
7.2.统计客户端地址为192.168.81.210访问/jiangxl页面多少次
7.1.添加筛选条件
1)客户端地址为192.168.81.210
筛选的时候选择客户端内网地址字段,在写上匹配的值
2)请求的页面为/jiangxl
筛选URL字段值为/jiangxl HTTP/1.1
7.2.查看统计数据
两个筛选器都勾选后即可字段筛选出统计数据,右上角为总数,中间为具体日志内容