beats 是一个免费且开放的平台,集合了多种单一用途数据采集器。它们从成百上千或成千上万台机器和系统向 Logstash 或 Elasticsearch 发送数据。
这边我们使用beat下面的FileBeat日志采集工具
FileBeat轻量型日志采集器
当您要面对成百上千、甚至成千上万的服务器、虚拟机和容器生成的日志时,请告别 SSH 吧。Filebeat 将为您提供一种轻量型方法,用于转发和汇总日志与文件,让简单的事情不再繁杂。
汇总、“tail -f”和搜索
启动 Filebeat 后,打开 Logs UI,直接在 Kibana 中观看对您的文件进行 tail 操作的过程。通过搜索栏按照服务、应用程序、主机、数据中心或者其他条件进行筛选,以跟踪您的全部汇总日志中的异常行为。
性能稳健,不错过任何检测信号
无论在任何环境中,随时都潜伏着应用程序中断的风险。Filebeat 能够读取并转发日志行,如果出现中断,还会在一切恢复正常后,从中断前停止的位置继续开始。
Filebeat 让简单的事情简单化
Filebeat 内置有多种模块(Apache、Cisco ASA、Microsoft Azure、NGINX、MySQL 等等),可针对常见格式的日志大大简化收集、解析和可视化过程,只需一条命令即可。之所以能实现这一点,是因为它将自动默认路径(因操作系统而异)与 Elasticsearch 采集节点管道的定义和 Kibana 仪表板组合在一起。不仅如此,数个 Filebeat 模块还包括预配置的 Machine Learning 任务。
它不会导致您的管道过载
当将数据发送到 Logstash 或 Elasticsearch 时,Filebeat 使用背压敏感协议,以应对更多的数据量。如果 Logstash 正在忙于处理数据,则会告诉 Filebeat 减慢读取速度。一旦拥堵得到解决,Filebeat 就会恢复到原来的步伐并继续传输数据。
输送至 Elasticsearch 或 Logstash。在 Kibana 中实现可视化。
Filebeat 是 Elastic Stack 的一部分,因此能够与 Logstash、Elasticsearch 和 Kibana 无缝协作。无论您要使用 Logstash 转换或充实日志和文件,还是在 Elasticsearch 中随意处理一些数据分析,亦或在 Kibana 中构建和分享仪表板,Filebeat 都能轻松地将您的数据发送至最关键的地方。
mkdir /opt/software/beats
tar -xvf filebeat-6.2.2-linux-x86_64.tar.gz
cd filebeat-6.2.2-linux-x86_64 #创建如下配置文件 test.yml
filebeat.prospectors:
- type: stdin enabled: true
setup.template.settings: index.number_of_shards: 3
output.console: pretty: true enable: true #启动filebeat
./filebeat -e -c test.yml #输入hello运行结果如下:
hello
{ "@timestamp": "2019-01-12T12:50:03.585Z", "@metadata": { #元数据信息 "beat": "filebeat", "type": "doc", "version": "6.2.2" },"source": "", "offset": 0, "message": "hello", #输入的内容 "prospector": { #标准输入勘探器 "type": "stdin" },"input": { #控制台标准输入 " type": "stdin" },"beat": { #beat版本以及主机信息 "name": "itcast01", "hostname": "itcast01", "version": "6.2.2" },"host": { "name": "itcast01" }
}
3、读取文件
#配置读取文件项 test-log.yml
filebeat.prospectors:
- type: log enabled: true paths: - /test/beats/logs/*.log
setup.template.settings: index.number_of_shards: 3
output.console: pretty: true enable: true
#启动filebeat
./filebeat -e -c test-log.yml
#/opt/software/beats/logs下创建a.log文件,并输入如下内容
hello
world
#观察filebeat输出
{ "@timestamp": "2019-01-12T14:16:10.192Z","@metadata": { "beat": "filebeat", "type": "doc", "version": "6.2.2" },"host": { "name": "itcast01" },"source": "/test/beats/logs/a.log", "offset": 0, "message": "hello", "prospector": { "type": "log" },"input": { "type": "log" },"beat": { "version": "6.2.2", "name": "itcast01", "hostname": "itcast01" }
}
{ "@timestamp": "2019-01-12T14:16:10.192Z", "@metadata": { "beat": "filebeat", "type": "doc", "version": "6.2.2" },"prospector": { "type": "log" },"input": { "type": "log" },"beat": { "version": "6.2.2", "name": "itcast01", "hostname": "itcast01" },"host": { "name": "itcast01" },"source": "/test/beats/logs/a.log", "offset": 6, "message": "world"
}
当a.log有变化时,会检测到日志文件有更新,会立刻读取文件的内容,并输出到控制台
#配置读取文件项 test-log.yml
filebeat.prospectors:
- type: log enabled: true paths: - /opt/software/beats/logs/*.log tags: ["web"] #添加自定义tag,便于后续的处理 fields: #添加自定义字段 from: test-im fields_under_root: true #true为添加到根节点,false为添加到子节点中
setup.template.settings: index.number_of_shards: 3
output.console: pretty: true enable: true
#启动filebeat
./filebeat -e -c test-log.yml
#/opt/software/beats/logs下创建a.log文件,并输入如下内容
123
#执行效果
{ "@timestamp": "2019-01-12T14:37:19.845Z", "@metadata": { "beat": "filebeat", "type": "doc", "version": "6.2.2" },"offset": 0, "tags": [ "test-im" ],"prospector": { "type": "log" },"beat": { "name": "itcast01", "hostname": "itcast01", "version": "6.2.2" },"host": { "name": "itcast01" },"source": "/opt/software/beats/logs/a.log", "message": "123", "input": { "type": "log" },"from": "test-im"
}
# test-log.yml
filebeat.prospectors: - type: log enabled: true paths: - /opt/software/beats/logs/*.log tags: ["test-im"] fields: from: test-im fields_under_root: false
setup.template.settings: index.number_of_shards: 3 #指定索引的分区数
output.elasticsearch: #指定ES的配置 hosts: ["192.168.1.7:9200","192.168.1.7:9201","192.168.1.7:9202"]#可在Kibana后台查看到相应的数据
Filebeat由两个主要组件组成:prospector 和 harvester。
harvester:
prospector
prospector 负责管理harvester并找到所有要读取的文件来源。
如果输入类型为日志,则查找器将查找路径匹配的所有文件,并为每个文件启动一个harvester。
Filebeat目前支持两种prospector类型:log和stdin。
Filebeat如何保持文件的状态
Filebeat 保存每个文件的状态并经常将状态刷新到磁盘上的注册文件中。
该状态用于记住harvester正在读取的最后偏移量,并确保发送所有日志行。
如果输出(例如Elasticsearch或Logstash)无法访问,Filebeat会跟踪最后发送的行,并在输出再次可用时继续读取文件。
在Filebeat运行时,每个prospector内存中也会保存的文件状态信息,当重新启动Filebeat时,将使用注册
文件的数据来重建文件状态,Filebeat将每个harvester在从保存的最后偏移量继续读取。文件状态记录在data/registry文件中
./filebeat -e -c test.yml
./filebeat -e -c test.yml -d "publish"
#参数说明
-e: 输出到标准输出,默认输出到syslog和logs下
-c: 指定配置文件
-d: 输出debug信息
#测试: ./filebeat -e -c test-log.yml -d "publish"
DEBUG [publish] pipeline/processor.go:308 Publish event: { "@timestamp": "2019-01-12T15:03:50.820Z", "@metadata": { "beat": "filebeat", "type": "doc", "version": "6.2.2" },"offset": 0, "tags": [ "test-im" ],"input": { "type": "log" },"prospector": { "type": "log" },"beat": { "name": "itcast01", "hostname": "itcast01", "version": "6.2.2" },"source": "/opt/software/beats/logs/a.log", "fields": { "from": "test-im" },"host": { "name": "itcast01" },"message": "456"
}
前面要想实现日志数据的读取以及处理都是自己手动配置的,其实,在Filebeat中,有大量的Module,可以简化我们的配置,直接就可以使用,如下:
./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已经被启用。
.
├── log #日志
│ ├── config
│ │ └── log.yml
│ ├── ingest
│ │ └── pipeline.json
│ └── manifest.yml
├── module.yml
└── slowlog #慢查询日志
├── config
│ └── slowlog.yml
├── ingest
│ └── pipeline.json
└── manifest.yml
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: ["/data/redis-data/node01/*.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:
redis默认情况下,是不会输出日志的,需要进行配置,前面我们使用的容器都没有配置日志输出,下面需要配置一下。
loglevel 日志等级分为:debug、verbose、notice、warning
其中,debug 会有大量信息,对开发、测试有用;
verbose 等于log4j 中的info,有很多信息,但是不会像debug那样乱;
notice 一般信息;
warning 只有非常重要/关键的消息被记录。
docker create --name redis-node01 -v /data/redis-data/node01:/data -p 6379:6379 redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-01.conf --loglevel debug --logfile nodes-node-01.log docker create --name redis-node02 -v /data/redis-data/node02:/data -p 6380:6379 redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-02.conf --loglevel debug --logfile nodes-node-02.log docker create --name redis-node03 -v /data/redis-data/node03:/data -p 6381:6379 redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-03.conf --loglevel debug --logfile nodes-node-03.log
#vim test-redis.yml
filebeat.prospectors:
- type: log enabled: true paths: - /test/log/*.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 #运行
./filebeat -e -c test-redis.yml --modules redis#测试发现,数据已经写入到了Elasticsearch中。
#vim test-udp.yml
filebeat.prospectors:
- type: udpenabled: truemax_message_size: 10KiBhost: "0.0.0.0:8080"fields:type: udp
output.console:pretty: trueenable: true#在本机测试通过 echo 你好 > /dev/udp/192.168.179.128/8080 发送数据测试