164. ELK应用之Filebeat 日志分析

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="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}" />
	       
.....

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) - 当前请求的线程名称
发布了184 篇原创文章 · 获赞 72 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/chengyinwu/article/details/103978336