1. Filebeat基本介绍
Filebeat是用于“转发”和“集中日志数据”的“轻量型数据采集器”。Filebeat 监视您指定的日志文
件路径,收集日志事件并将数据转发到Elasticsearch或Logstash、Redis、 Kafka等。
2. Filebeat主要组件
Filebeat包含两个主要组件:输入和收割机,这些组件协同工作将文件尾部最新事件数据发送到指 定的输出
1.输入(Input ) :
输入负责管理收割机从哪个路径查找所有可读取的资源。
2.收割机( Harvester ) :负责逐行读取单 个文件的内容,然后将内容发送到输出。
3. Filebeat工作流程
当filebeat启动后, filebeat通过Input读取指定的日志路径,然后为该日志启动一个收割进程
(harvester ) ,每一个收割进程读取一 一个日志文件的新内容 ,并发送这些新的日志数据到处理程
序(spooler ) , 处理程序会集台这些事件,最后ilebeat会发送集 台的数据到你指定的地点
input 我们要采集的日志文件路径, 收割机 *harvester* 监听文件的变化 -->splooer程序 --> 转发 es | logstash | kafka | redis
4. Filebeat配置介绍
5. Filebeat基本使用
5.1 安装Filebeat
[root@web01 ~]# rpm -ivh filebeat-7.4.0-x86_64.rpm
[root@web01 ~]# systemctl enable filebeat
[root@web01 ~]# systemctl start filebeat
5.2 配置Filebeat
1. 标准输入方式
[root@web01 ~]# cd /etc/filebeat/
[root@web01 filebeat]# cat test.yml
filebeat.inputs:
- type: stdin #标准输入
enabled: true #启用
output.console: #标准输出
pretty: true
enable: true
测试启动:
[root@web01 filebeat]# filebeat -e -c test.yml
123
{
"@timestamp": "2020-01-14T00:49:57.756Z", #时间戳
"@metadata": { #元数据信息
"beat": "filebeat",
"type": "_doc", #类型[log |stdin |redis |udp |docker]
"version": "7.4.0" #版本
},
"log": {
"offset": 0, #设置文件偏移量
"file": {
"path": ""
}
}
"message": "123", #
"input": {
"type": "stdin" #标准输入
},
"ecs": {
"version": "1.1.0"
},
"host": {
"name": "web01" #主机名
},
"agent": {
"hostname": "web01",
"id": "416cd9e7-97dd-41b6-aa2d-104454da5b52",
"version": "7.4.0",
"type": "filebeat",
"ephemeral_id": "f05eb693-dc9e-4633-baed-6c8af042f6ee"
},
}
2.配置Filebeat从文件中读取数据
[root@web01 filebeat]# cat file.yml
filebeat.inputs:
- type: log
paths: /var/log/nginx/access.log
enabled: true
output.elasticsearch: #输出到elasticsearch集群
hosts: ["10.0.0.161:9200","10.0.0.162:9200","10.0.0.163:9200"]
index: nginx-access-log
setup.template.name: nginx #设定模板为nginx
setup.template.pattern: nginx-* #匹配
[root@web01 filebeat]# filebeat -e -c file.yml
6. Filebeat收集系统日志
1.系统日志- -般指的是哪些?
系统日志其实很宽汪通常我们说的是messages.secure、cron、 dmesg、 ssh、 boot等日志。
2.系统日志如何统一规范收集?
系统中有很多日志,挨个配置收集就变得非常麻烦了。所以我们需要对这些日志进行统一、集中的管理。
可以通过rsyslog将本地所有类型的日志都写入ar/log/cheng.log文件中,然后使用filebeat对该文件进行收集即可。
3.收集系统日志流程:
rsyslog+filebeat --> elasticsearch集群<--kibana
=========================================================================================
1. 安装rsyslog
[root@web01 ~]# yum install rsyslog -y
2. 配置rsyslog
[root@web01 ~]# vim /etc/rsyslog.conf #最后一行加入以下内容
*.* /var/log/cheng.log #将所有日志保存至本地/var/log/cheng.log
3. 重启rsyslog,并进行测试
[root@web01 ~]# systemctl restart rsyslog.service
7. 修改Filebeat配置,优化kibana展示的数据
kibana展示的结果上有很多Debug消息,其实该类消息无需收集,所以我们可以对收集的日志内
容进行优化,只收集警告WARNT错误ERR、sshd相关的日志。
1.减少无用的数据
2.调整索引名称
3.测试调整模板,设定分片
修改filebeat配置文件如下
[root@web01 ~]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/cheng.log
include_lines: ['^ERR', '^WARN', 'sshd'] #只看指定的日志
output.elasticsearch:
hosts: ["10.0.0.161:9200","10.0.0.162:9200","10.0.0.163:9200"]
index: "system-%{[agent.version]}-%{+yyyy.MM.dd}"
setup.ilm.enabled: false
setup.template.name: system #索引关联的模板名称
setup.template.pattern: system-*
方式一:
设定system模板的分片数和副本数
setup.template.settings: #定义索引分片数和副本
index.number_of_shards: 3
index.number_of_replicas: 1
方式二:
"number_of_routing_shards": "30",
"number_of_shards": "10",
"number_of_replicas": "1",
1.修改system模板 ---> 添加 shards 分片数数
量,replicas的数量
2.删除模板关联的索引
3.删除filebeat自行指定的分片数和副本数
4.重启filebeat
5.产生新的日志
8.Nginx json日志收集
1.问题现象?
虽然实现了日志收集,但是所有的数据都在message字段中,无法满足分析的需求。比如我们想统计状态码,但是会发现没有办法过滤数据。
2.解决方案?
需要将日志中的每一个选项都拆分出来 ,拆分成key-value的形式,那么就需要借助ison的格式。
基本写法: chengyinwu 男22
json写法:姓名:chengyinwu 性别:男 年龄:20
当我们需要筛选姓名时, JSON的写法会将所有姓名对应的值都会被列出来,便于后续的统计与分析。
[root@web01 conf.d]# vim /etc/nginx/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;
[root@web01 filebeat]# cat filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
json.keys_under_root: true #默认Flase,还会将json解析
的日志存储至messages字段
json.overwrite_keys: true #覆盖默认的key,使用自定义
json格式的key
output.elasticsearch:
hosts:
["10.0.0.161:9200","10.0.0.162:9200","10.0.0.163:9200"]
index: "nginx-%{[agent.version]}-%{+yyyy.MM.dd}"
setup.ilm.enabled: false
setup.template.name: nginx #索引关联的模板名称
setup.template.pattern: nginx-*
9. 收集nginx访问日志和错误日志
[root@web01 filebeat]# cat filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
json.keys_under_root: true #默认Flase,还会将json解析
的日志存储至messages字段
json.overwrite_keys: true #覆盖默认的key,使用自定义
json格式的key
tags: ["access"]
- type: log
enabled: true
paths:
- /var/log/nginx/error.log
tags: ["error"]
output.elasticsearch:
hosts: ["10.0.0.161:9200","10.0.0.162:9200","10.0.0.163:9200"]
indices:
- index: "nginx-access-%{[agent.version]}-%{+yyyy.MM.dd}"
when.contains:
tags: "access"
- index: "nginx-error-%{[agent.version]}-%{+yyyy.MM.dd}"
when.contains:
tags: "error"
setup.ilm.enabled: false
setup.template.name: nginx #索引关联的模板名称
setup.template.pattern: nginx-*
10. 收集nginx多个虚拟主机的日志
[root@web01 filebeat]# cat filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
json.keys_under_root: true #默认Flase,还会将json解析的日志存储至messages字段
json.overwrite_keys: true #覆盖默认的key,使用自定义json格式的key
tags: ["nginx-access"]
- type: log
enabled: true
paths:
- /var/log/nginx/blog-access.log
json.keys_under_root: true #默认Flase,还会将json解析的日志存储至messages字段
json.overwrite_keys: true #覆盖默认的key,使用自定义json格式的key
tags: ["blog-access"]
- type: log
enabled: true
paths:
- /var/log/nginx/www-access.log
json.keys_under_root: true #默认Flase,还会将json解析的日志存储至messages字段
json.overwrite_keys: true #覆盖默认的key,使用自定义json格式的key
tags: ["www-access"]
- type: log
enabled: true
paths:
- /var/log/nginx/error.log
tags: ["error"]
output.elasticsearch:
hosts: ["10.0.0.161:9200","10.0.0.162:9200","10.0.0.163:9200"]
indices:
- index: "nginx-access-%{[agent.version]}-%{+yyyy.MM.dd}"
when.contains:
tags: "nginx-access"
- index: "blog-access-%{[agent.version]}-%{+yyyy.MM.dd}"
when.contains:
tags: "blog-access"
- index: "www-access-%{[agent.version]}-%{+yyyy.MM.dd}"
when.contains:
tags: "www-access"
- index: "nginx-error-%{[agent.version]}-%{+yyyy.MM.dd}"
when.contains:
tags: "error"
setup.ilm.enabled: false
setup.template.name: nginx #索引关联的模板名称
setup.template.pattern: nginx-*
#setup.template.settings: #定义索引分片数和副本
# index.number_of_shards: 3
# index.number_of_replicas: 1
[root@web01 filebeat]# systemctl restart nginx filebeat.service
11. 收集Tomcat服务器日志
1.安装
[root@web02 ~]# rpm -ivh filebeat-7.4.0-x86_64.rpm
2. 安装Tomcat
。。。。。。。。。。。。。。。。。。。
3.配置tomcat日志格式为json格式
[root@web02 ~]# vim /soft/tomcat/conf/server.xml
.......
<Host name="tomcat.cheng.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="tomcat.cheng.com.log" suffix=".txt"
pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}" />
.....
4. 配置filebeat
[root@web02 filebeat]# cat filebeat-tomcat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /soft/tomcat/logs/tomcat.cheng.com.log.*.txt
json.keys_under_root: true #默认Flase,还会将json解析的日志存储至messages字段
json.overwrite_keys: true #覆盖默认的key,使用自定义json格式的key
output.elasticsearch:
hosts: ["10.0.0.161:9200","10.0.0.162:9200"]
index: "tomcat-access-%{[agent.version]}-%{+yyyy.MM.dd}"
setup.ilm.enabled: false
setup.template.name: tomcat #索引关联的模板名称
setup.template.pattern: tomcat-*
5. 配置错误日志 <--java
[root@web02 filebeat]# cat filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /soft/tomcat/logs/tomcat.cheng.com.log.*.txt
json.keys_under_root: true #默认Flase,还会将json解析的日志存储至messages字段
json.overwrite_keys: true #覆盖默认的key,使用自定义json格式的key
tags: ["tomcat-access"]
- type: log
enabled: true
paths:
- /soft/tomcat/logs/catalina.out
multiline.pattern: '^\d{2}' #匹配以2个数字开头的
multiline.negate: true
multiline.match: after
multiline.max_lines: 10000 #默认最大合并行为500,可根据实际情况调整。
tags: ["tomcat-error"]
output.elasticsearch:
hosts: ["10.0.0.161:9200","10.0.0.162:9200"]
indices:
- index: "tomcat-access-%{[agent.version]}-%{+yyyy.MM.dd}"
when.contains:
tags: "tomcat-access"
- index: "tomcat-error-%{[agent.version]}-%{+yyyy.MM.dd}"
when.contains:
tags: "tomcat-error"
setup.ilm.enabled: false
setup.template.name: tomcat #索引关联的模板名称
setup.template.pattern: tomcat-*
tomcat日志格式中的含义
%a - 远程IP地址
%A - 本地IP地址
%b - 发送的字节数,不包括HTTP头,或“ - ”如果没有发送字节
%B - 发送的字节数,不包括HTTP头
%h - 远程主机名
%H - 请求协议
%l (小写的L)- 远程逻辑从identd的用户名(总是返回' - ')
%m - 请求方法
%p - 本地端口
%q - 查询字符串(在前面加上一个“?”如果它存在,否则是一个空字符串
%r - 第一行的要求
%s - 响应的HTTP状态代码
%S - 用户会话ID
%t - 日期和时间,在通用日志格式
%u - 远程用户身份验证
%U - 请求的URL路径
%v - 本地服务器名
%D - 处理请求的时间(以毫秒为单位)
%T - 处理请求的时间(以秒为单位)
%I (大写的i) - 当前请求的线程名称