美文网首页
Docker ELK实践之Filebeat

Docker ELK实践之Filebeat

作者: 土豆肉丝盖浇饭 | 来源:发表于2018-07-27 14:18 被阅读496次

本文基于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"
        }
}

  1. 去除从文件读取日志的配置,input增加beats模块,专门接收beats传送的数据,启动logstash的时候需要用-p命令吧5044端口开放出来
  2. filebeat会额外增加一些字段,我们需要重新进行处理,比如之前我们通过logstash的path字段取项目名称,在使用了filebeat后,我们从filebeat的source字段提取
  3. 从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)

最后

看到这里的观众,关注吧,关于技术的一切我都有可能分享

相关文章

网友评论

      本文标题:Docker ELK实践之Filebeat

      本文链接:https://www.haomeiwen.com/subject/itnbmftx.html