海量可视化日志分析平台之ELK搭建-Beats

1.Beats 简介

在这里插入图片描述
官网:https://www.elastic.co/cn/products/beats

在这里插入图片描述
数据采集使用beats ,Filebeat隶属于Beats。beat是一个轻量级的数据传输者,它有好几种分类,这里暂时只用到Filebeat。

目前Beats包含四种工具:
在这里插入图片描述

Packetbeat:搜集网络流量数据,是一个网络包分析器,用于监控,收集网络流量信息,Package嗅探服务器之间的流量,解析应用层信息,并关联到消息的处理,器支持ICMP(v4和v6),DNS,HTTPS,Mysql,Postgresql协议
Topbeat:搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据
Filebeat:搜集文件数据,用域监控,手机服务器的日志文件,器已经取代Logstash forwarder
Winlogbeat:搜集 Windows 事件日志数据
Mertricbeat:可定期获取外部系统的监控指标信息,可用于监控手机Apache,Haproxy,MongoDb,Mysql,Nginx,等服务

Beats系列产品
在这里插入图片描述

2.Filebeat

在这里插入图片描述

2.1.架构

用于监控、收集服务器日志文件。Filebeat的处理流程基本分为3部分:Input、Filter、Output。
在这里插入图片描述

2.2.部署与运行

下载地址:https://www.elastic.co/downloads/beats
项目中使用的版本为:filebeat-6.5.4

tar -xvf filebeat-6.5.4-linux-x86_64.tar.gz
cd filebeat-6.5.4-linux-x86_64

#创建如下配置文件 filebeat_test1.yml
filebeat.inputs:
- type: stdin
  enabled: true
setup.template.settings:
  index.number_of_shards: 3
output.console:
  pretty: true
  enable: true

#启动filebeat
./filebeat -e -c filebeat_test1.yml

#输入hello运行结果如下:
hello

{
  "@timestamp": "2019-12-18T04:34:25.638Z",
  "@metadata": {   #元数据信息
    "beat": "filebeat",
    "type": "doc",
    "version": "6.5.4"
  },
  "beat": { #beat版本以及主机信息
    "name": "VM_0_15_centos",
    "hostname": "VM_0_15_centos",
    "version": "6.5.4"
  },
  "host": {
    "name": "VM_0_15_centos"
  },
  "offset": 0,
  "message": "hello",#输入的内容
  "source": "",
  "input": { #控制台标准输入
    "type": "stdin"
  },
  "prospector": { #标准输入勘探器
    "type": "stdin"
  }
}

2.3.读取文件

#配置读取文件项 filebeat_log.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
   - /opt/beats/logs/*.log
setup.template.settings:
  index.number_of_shards: 3
output.console:
  pretty: true
  enable: true
 
#启动filebeat
./filebeat -e -c filebeat_log.yml

#/opt/beats/logs下创建test.log文件,并输入如下内容
这是测试内容
123123

#观察filebeat输出
{
  "@timestamp": "2019-12-18T08:29:22.527Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "doc",
    "version": "6.5.4"
  },
  "host": {
    "name": "VM_0_15_centos"
  },
  "source": "/opt/beats/logs/test.log",
  "offset": 0,
  "message": "这是测试内容",
  "input": {
    "type": "log"
  },
  "prospector": {
    "type": "log"
  },
  "beat": {
    "name": "VM_0_15_centos",
    "hostname": "VM_0_15_centos",
    "version": "6.5.4"
  }
}
{
  "@timestamp": "2019-12-18T08:29:22.527Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "doc",
    "version": "6.5.4"
  },
  "source": "/opt/beats/logs/test.log",
  "offset": 19,
  "prospector": {
    "type": "log"
  },
  "input": {
    "type": "log"
  },
  "beat": {
    "name": "VM_0_15_centos",
    "hostname": "VM_0_15_centos",
    "version": "6.5.4"
  },
  "host": {
    "name": "VM_0_15_centos"
  },
  "message": "123123"
}

可以看出,已经检测到日志文件有更新,立刻就会读取到更新的内容,并且输出到控制台。

2.4.自定义字段

#配置读取文件项 haoke-log.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
   - /opt/beats/logs/*.log
  tags: ["web"] #添加自定义tag,便于后续的处理
  fields: #添加自定义字段
    from: bruceliu_web
  fields_under_root: true #true为添加到根节点,false为添加到子节点中
setup.template.settings:
  index.number_of_shards: 3
output.console:
  pretty: true
  enable: true

#启动filebeat
./filebeat -e -c filebeat_log.yml

#观察filebeat输出
{
  "@timestamp": "2019-12-18T08:36:34.766Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "doc",
    "version": "6.5.4"
  },
  "tags": [
    "web"
  ],
  "prospector": {
    "type": "log"
  },
  "beat": {
    "name": "VM_0_15_centos",
    "hostname": "VM_0_15_centos",
    "version": "6.5.4"
  },
  "from": "bruceliu_web",
  "host": {
    "name": "VM_0_15_centos"
  },
  "source": "/opt/beats/logs/test.log",
  "offset": 0,
  "message": "这是测试内容",
  "input": {
    "type": "log"
  }
}
{
  "@timestamp": "2019-12-18T08:36:34.766Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "doc",
    "version": "6.5.4"
  },
  "host": {
    "name": "VM_0_15_centos"
  },
  "source": "/opt/beats/logs/test.log",
  "offset": 19,
  "message": "123123",
  "from": "bruceliu_web",
  "input": {
    "type": "log"
  },
  "tags": [
    "web"
  ],
  "prospector": {
    "type": "log"
  },
  "beat": {
    "hostname": "VM_0_15_centos",
    "version": "6.5.4",
    "name": "VM_0_15_centos"
  }
}

2.5.输出到Elasticsearch

#配置读取文件项 haoke-log.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
   - /opt/beats/logs/*.log
  tags: ["bruceliu_web"] #添加自定义tag,便于后续的处理
  fields: #添加自定义字段
    from: bruceliu_web
  fields_under_root: true #true为添加到根节点,false为添加到子节点中
setup.template.settings:
  index.number_of_shards: 3   #指定索引的分区数
output.elasticsearch: #指定ES的配置
  hosts: ["122.51.50.249:9200"]

#启动filebeat
./filebeat -e -c filebeat_log.yml

在日志文件中输入新的内容进行测试:
在这里插入图片描述
查看数据:
在这里插入图片描述

2.6.Filebeat工作原理

在这里插入图片描述

Harvester(收割机):负责读取单个文件内容。每个文件会启动一个Harvester,每个Harvester会逐行读取各个文件,并将文件内容发送到制定输出中。Harvester负责打开和关闭文件,意味在Harvester运行的时候,文件描述符处于打开状态,如果文件在收集中被重命名或者被删除,Filebeat会继续读取此文件。所以在Harvester关闭之前,磁盘不会被释放。默认情况filebeat会保持文件打开的状态,直到达到close_inactive(如果此选项开启,filebeat会在指定时间内将不再更新的文件句柄关闭,时间从harvester读取最后一行的时间开始计时。若文件句柄被关闭后,文件发生变化,则会启动一个新的harvester。关闭文件句柄的时间不取决于文件的修改时间,若此参数配置不当,则可能发生日志不实时的情况,由scan_frequency参数决定,默认10s。Harvester使用内部时间戳来记录文件最后被收集的时间。例如:设置5m,则在Harvester读取文件的最后一行之后,开始倒计时5分钟,若5分钟内文件无变化,则关闭文件句柄。默认5m)。

Prospector(勘测者):负责管理Harvester并找到所有读取源。Prospector会找到/apps/logs/*目录下的所有info.log文件,并为每个文件启动一个Harvester。Prospector会检查每个文件,看Harvester是否已经启动,是否需要启动,或者文件是否可以忽略。若Harvester关闭,只有在文件大小发生变化的时候Prospector才会执行检查。只能检测本地的文件。

Filebeat如何记录文件状态:

将文件状态记录在文件中(默认在/var/lib/filebeat/registry)。此状态可以记住Harvester收集文件的偏移量。若连接不上输出设备,如ES等,filebeat会记录发送前的最后一行,并再可以连接的时候继续发送。Filebeat在运行的时候,Prospector状态会被记录在内存中。Filebeat重启的时候,利用registry记录的状态来进行重建,用来还原到重启之前的状态。每个Prospector会为每个找到的文件记录一个状态,对于每个文件,Filebeat存储唯一标识符以检测文件是否先前被收集。

Filebeat如何保证事件至少被输出一次:

Filebeat之所以能保证事件至少被传递到配置的输出一次,没有数据丢失,是因为filebeat将每个事件的传递状态保存在文件中。在未得到输出方确认时,filebeat会尝试一直发送,直到得到回应。若filebeat在传输过程中被关闭,则不会再关闭之前确认所有时事件。任何在filebeat关闭之前为确认的时间,都会在filebeat重启之后重新发送。这可确保至少发送一次,但有可能会重复。可通过设置shutdown_timeout 参数来设置关闭之前的等待事件回应的时间(默认禁用)。

2.7.Module

前面要想实现日志数据的读取以及处理都是自己手动配置的,其实,在Filebeat中,有大量的Module,可以简化我们的配置,直接就可以使用,如下:

[root@VM_0_15_centos filebeat-6.5.4-linux-x86_64]# ./filebeat modules list
Enabled:

Disabled:
apache2
auditd
elasticsearch
haproxy
icinga
iis
kafka
kibana
logstash
mongodb
mysql
nginx
osquery
postgresql
redis
suricata
system
traefik

可以看到,内置了很多的module,但是都没有启用,如果需要启用需要进行enable操作:

./filebeat modules enable redis #启动
./filebeat modules disable redis #禁用
Enabled:
redis
Disabled:
apache2
auditd
elasticsearch
haproxy
icinga
iis
kafka
kibana
logstash
mongodb
mysql
nginx
osquery
postgresql
suricata
system
traefik

可以发现,redis的module已经被启用。

2.7.1.redis module

module目录:

. ├──
log #日志
│ ├── config
│ │ └── log.yml
│ ├── ingest
│ │ └── pipeline.json
│ └── manifest.yml
├── module.yml
└──
slowlog #慢查询日志
├── config
│ └── slowlog.yml
├── ingest
│ └── pipeline.json
└──
manifest.yml

2.7.2.redis module 配置

cd modules.d/
vim redis.yml

- module: redis
# Main logs
log:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths: ["/opt/redis/redis.log"]
# Slow logs, retrieved via the Redis API (SLOWLOG)
slowlog:
enabled: false
# The Redis hosts to connect to.
#var.hosts: ["localhost:6379"]
# Optional, the password to use when connecting to Redis.
#var.password:

2.7.3.修改redis的配置文件

redis默认情况下,是不会输出日志的,需要进行配置,前面我们使用的容器都没有配置日志输出,下面需要配置一下。

# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel verbose

# Specify the log file name. Also the empty string can be used to force
# Redis to log on the standard output. Note that if you use standard
# output for logging but daemonize, logs will be sent to /dev/null
logfile "/opt/redis/redis.log"

loglevel 日志等级分为:debug、verbose、notice、warning
其中,debug 会有大量信息,对开发、测试有用;
verbose 等于log4j 中的info,有很多信息,但是不会像debug那样乱;
notice 一般信息;
warning 只有非常重要/关键的消息被记录。

2.7.4.配置filebeat

#vim filebeat-redis.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
  - /opt/redis/*.log
setup.template.settings:
  index.number_of_shards: 3
output.console:
  pretty: true
  enable: true
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false

2.7.5.测试

./filebeat -e -c filebeat-redis.yml --modules redis

控制台开始打印日志信息了,当然,也可以将数据写入到Elasticsearch中。

发布了274 篇原创文章 · 获赞 80 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/BruceLiu_code/article/details/103595450