本文基于FileBeat5.6,6.0+配置可能有点差异
前言
接着上文Logstash,上文中我们通过Logstash收集解析日志,对于我们测试开发环境来讲没问题,因为所有应用都在一台32G的主机上,但是对于线上的机器,每个应用都在各自服务器,Logstash占用资源比较大,每台服务器都起一个Logstash是十分浪费性能的,所以我们需要使用轻量级的日志收集器Filebeat,Logstash单独部署在一台服务器用于解析日志。
我们可以看下我们开发环境Filebeat和Logstash的资源占用情况
Logstash Filebeat
内存占用相差接近40倍,Filebeat不会占用服务器很多资源,也就不怎么会影响到部署的应用的性能了。
FileBeat安装
docker pull docker.elastic.co/beats/filebeat:5.6.10
因为我的logstash是5.6.10版本,所以filebeat也使用这个版本
docker run -d
-v /app/logs:/app/logs
-v /etc/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml
-v /app/data/filebeat:/usr/share/filebeat/data
docker.elastic.co/beats/filebeat:5.6.10
上面这个命令主要关注磁盘挂载的配置,因为我在rancher上面配置,这个命令我不保证完全正确
-v /app/logs:/app/logs 映射日志目录
-v /etc/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml 映射filebeat配置文件
-v /app/data/filebeat:/usr/share/filebeat/data 映射filebeat存储,记录文件读取的文件在这里
下面贴上filebeat.yml
filebeat.prospectors:
- input_type: log
enabled: true
paths:
- /app/logs/**/*.log
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after
fields:
env: dev-1
output.logstash:
enabled: true
hosts: ["logstash:5044"]
output.console:
enabled: false
pretty: true
我们把之前logstash中收集日志以及处理日志换行的逻辑放到filebeat中来,output设置发送到logstash,为了方便调试,可以把console的配置打开
同时增加了一个自定义字段env: dev-1,用于查询时筛选各个环境的日志,对于每个项目的filebeats配置,这个env需要修改
Logstash修改
Logstash需要对pipeline配置文件做修改
input{
beats{
port => 5044
}
}
filter{
grok{
match =>{
"message" => "%{TIMESTAMP_ISO8601:date}\s*\[%{DATA:ip}\]\s*\[%{DATA:thread}\]\s*%{LOGLEVEL:level}\s*%{NOTSPACE:clazz}\s*-\s*%{DATA:method}\s*(?<body>[\S\s]*)"
}
remove_field => ["@timestamp","host","@version"]
}
grok{
match => {
"source" => "/app/logs/%{NOTSPACE:project}/"
}
}
mutate{
add_field =>{
"env" =>"%{[fields][env]}"
}
remove_field => ["fields","tags","offset","input_type","beat"]
}
mutate{
replace => ["date","%{date}+0800"]
}
date {
match => ["date", "yyyy-MM-dd HH:mm:ss.SSSZ"]
target => "@timestamp"
}
}
output{
elasticsearch{
hosts => "es:9200"
index => "testindex"
document_type => "testlog"
}
}
- 去除从文件读取日志的配置,input增加beats模块,专门接收beats传送的数据,启动logstash的时候需要用-p命令吧5044端口开放出来
- filebeat会额外增加一些字段,我们需要重新进行处理,比如之前我们通过logstash的path字段取项目名称,在使用了filebeat后,我们从filebeat的source字段提取
- 从filebeat过来的env变量会嵌套在fields属性下面,我们用mutate的add_field进行转换
数据
讲这么多,也不直观,直接看下demo数据,你就能更加直观看到数据怎么被处理的
filebeat发到logstash的数据
{
"@timestamp": "2018-07-27T06:06:32.219Z",
"beat": {
"hostname": "943d74347f9c",
"name": "943d74347f9c",
"version": "5.6.10"
},
"fields": {
"env": "dev-1"
},
"input_type": "log",
"message": "2018-07-27 14:06:31.684 [10.111.12.217] [New I/O worker #16] DEBUG c.a.dubbo.remoting.exchange.support.header.HeartbeatHandler - [DUBBO] Receive heartbeat response in thread New I/O worker #16, dubbo version: server, current host: 10.111.12.217",
"offset": 11517459,
"source": "/app/logs/ttms-server/ttms-server-dubbo.log",
"type": "log"
}
logstash处理后的数据
{
"date" => "2018-07-27 14:10:25.094+0800",
"level" => "DEBUG",
"ip" => "10.111.12.217",
"project" => "ttms-schedule",
"source" => "/app/logs/ttms-schedule/ttms-schedule-dubbo.log",
"thread" => "New I/O worker #9",
"message" => "2018-07-27 14:10:25.094 [10.111.12.217] [New I/O worker #9] DEBUG c.a.dubbo.remoting.exchange.support.header.HeartbeatHandler - [DUBBO] Receive heartbeat response in thread New I/O worker #9, dubbo version: schedule, current host: 10.111.12.217",
"type" => "log",
"body" => "[DUBBO] Receive heartbeat response in thread New I/O worker #9, dubbo version: schedule, current host: 10.111.12.217",
"env" => "dev-1",
"@timestamp" => 2018-07-27T06:10:25.094Z,
"clazz" => "c.a.dubbo.remoting.exchange.support.header.HeartbeatHandler"
}
主要做的工作是,解析filebeat传过来数据,并且删除一些无用的字段,最后这份有用的数据会落到ES中去。
总结
熟悉了logstash之后,在搭建filebeat就相对简单了,主要解析工作还是在logstash中,filebeat就是一个搬运工。除了filebeats,还有其他各种beats,能收集各种日志。
需要时候的时候再看文档就行。目前我只做业务日志的收集。
有什么具体细节就看官方文档(https://www.elastic.co/guide/en/beats/filebeat/current/index.html)
最后
看到这里的观众,关注吧,关于技术的一切我都有可能分享
网友评论