ELK之filebeat

2 篇文章 0 订阅

Filebeat学习整理


filebeat概述

Filebeat是本地文件的日志数据发送者。作为服务器上的代理安装,Filebeat监视日志目录或特定的日志文件,tails文件,并转发到Elasticsearch或Logstash索引。Filebeat是一个Beat,它是基于libbeat框架。
工作原理:启动Filebeat时,它会启动一个或多个prospectors(查找器),查看日志文件指定的本地路径。对于prospector所在的每个日志文件,Filebeat启动harvester(采集器)。每个采集器都会为新内容读取一个日志文件,并将新的日志数据发送到libbeat,后者将聚合这些事件并将聚合的数据发送到为Filebeat配置的输出
这里写图片描述

filebeat功能:

  • 读取日志文件,但不做数据的解析处理
  • 保证数据”At Least Once”至少被读取一次,即数据不会丢
  • 处理多行数据
  • 解析JSON格式数据
  • 简单的过滤功能

配置文件详解

#=========================== Filebeat prospectors =============================
filebeat.prospectors:
- type: log
  enabled: true     #更改为true以启用此prospectors配置。
  paths:            #应该被抓取和抓取的路径。 基于Glob的路径
    - /home/test/logstash-tutorial.log
  #tags: ["apache-access"]      #标签可以很容易地在Kibana中选择特定的事件,或者在Logstash中应用条件过滤。 这些标签将被追加到一般配置中指定的标签列表中
    #- c:\programdata\elasticsearch\logs\*
  #exclude_lines: ['^DBG']   #排除行。 要匹配的正则表达式列表。 它删除与列表中任何正则表达式匹配的行。
  #include_lines: ['^ERR', '^WARN']     #包括行。 要匹配的正则表达式列表。 它从列表中导出与任何正则表达式匹配的行。
  #exclude_files: ['.gz$']     #排除文件。 要匹配的正则表达式列表。 Filebeat会从列表中删除与任何正则表达式匹配的文件。 默认情况下,没有文件被丢弃。
  #fields:      #可选的附加字段。 可以自由选择这些字段,以将其他信息添加到搜寻的日志文件中进行过滤
  #  level: debug
  #  review: 1
  #fields_under_root: true
  #json.keys_under_root: true
  #json.add_error_key: true

  ### Multiline options
  #multiline.pattern: ^\[       #比配的正则表达式
  #multiline.negate: false      #定义模式下的模式是否应该被否定。 默认是false#multiline.match: after       #匹配可以设置为“after”或“before”。 它用于定义行是否应该附加到之前或之后(不匹配)的模式,或者只要模式不匹配,则基于否定。 

#============================= Filebeat modules ===============================
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml   #配置加载的全局模式
  reload.enabled: true      #设置为true以启用配置重新加载
  reload.period: 10s        #应检查路径下文件的更改时间间隔

#================================ General =====================================
name: "192.168.20.60"  #发布网络数据的发送人的名称。 它可以用于将单个发货人在Web界面中发送的所有传输进行分组。
#tags: ["service-X", "web-tier"]  #发送人的标签包含在他们自己的字段中,每次传输都会发布。
#fields:        #可选字段,可以指定将其他信息添加到输出。
#  env: staging

#============================== Dashboards =====================================
#setup.dashboards.enabled: false    #这些设置控制将示例仪表板加载到Kibana索引。 加载仪表板默认是禁用的,可以通过在这里设置选项来启用,或者使用`-setup` CLI标记或`setup`命令启用。
#setup.dashboards.url:   #从哪里下载仪表板归档的URL。 默认情况下,这个URL的值是根据节拍名称和版本计算的。 对于发布的版本,此URL指向artifacts.elastic.co网站上的仪表板存档。

#============================== Kibana =====================================
#从Beats版本6.0.0开始,仪表板通过Kibana API加载。这需要一个Kibana端点配置。
setup.kibana:
  host: "192.168.20.60:5601"

#================================ Outputs =====================================
#配置发送beat收集的数据时使用的输出。
#-------------------------- Elasticsearch output ------------------------------
#output.elasticsearch:
  #hosts: ["192.168.20.60:9200"]  #要连接的主机数组。
  #protocol: "https"        #可选协议和基本认证凭证。
  #username: "elastic"      #elasticsearch 的用户密码,需要安装x-pack才会有
  #password: "changeme"

#----------------------------- Logstash output --------------------------------
output.logstash:
  hosts: ["192.168.20.60:5044"]     #Logstash主机
  # loadbalance: true   #如果设置为true,并且配置了多个Logstash主机,则输出插件将已发布的事件负载平衡到所有Logstash主机上。 如果设置为false,则输出插件会将所有事件发送到只有一个主机(随机确定),并且如果所选事件不响应,将切换到另一个主机。 默认值是false 
  #compression_level: 6     #gzip压缩级别。 将此值设置为0将禁用压缩。 压缩级别必须在1(最佳速度)到9(最佳压缩)的范围内。

  #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]     #可选的SSL。默认是关闭的。HTTPS服务器验证的根证书列表
  #ssl.certificate: "/etc/pki/client/cert.pem"      #SSL客户端认证证书
  #ssl.key: "/etc/pki/client/cert.key"       #客户证书密钥

#================================ Logging =====================================
#logging.level: debug   ##设置日志级别。 默认的日志级别是info。可用的日志级别是:critical, error, warning, info, debug
#logging.selectors: ["*"]  ##在调试级别,您可以选择性地启用仅针对某些组件的日志记录。 要启用所有选择器,请使用[“*”]。 其他选择器的例子是“beat”,“publish”,“service”。

使用模块

使用Filebeat模块是可选的,提供了一种快速处理常见日志格式的方法。它们包含默认配置、 Elasticsearch的节点管道定义,以及Kibana指示板。
Filebeat提供了几种不同的方式来启用模块:

  • 在modules.d目录下启用模块配置
./filebeat modules enable apache2   #启用apache2模块
./filebeat modules list     #查看启用和禁用模块的列表
# filebeat modules list
Enabled:
apache2     #解析由Apache HTTP服务器创建的访问和错误日​​志 

Disabled:
auditd      #收集并分析来自审计守护进程(auditd)的日志
icinga      #解析Icinga的主要日志,调试日志和启动日志 (监控)
kafka       #收集并分析由Kafka创建的日志 
logstash    #解析logstash常规日志和慢日志,支持纯文本格式和JSON格式
mysql       #收集并分析由MySQL创建的慢日志和错误日志
nginx       #分析由Nginx HTTP服务器创建的访问和错误日​​志
osquery     #收集并解码由osqueryd 以JSON格式编写的结果日志 。要设置osqueryd,请遵循操作系统的osquery安装说明并配置filesystem日志记录驱动程序(默认设置)。确保UTC时间戳已启用
postgresql  #收集并分析由PostgreSQL创建的日志
redis       #分析由Redis创建的日志和缓慢日志 
system      #收集和分析由基于Unix / Linux的常见发行版的系统日志记录服务创建的日志
traefik     #分析由Træfik创建的访问日志 (反向代理和负载均衡)

  • 运行Filebeatedit时启用模块
    ./filebeat -e --modules nginx,apache2
  • 在filebeat.yml文件中启用模块配置

    推荐使用modules.d目录中的配置文件,在filebeat.yml文件中配置模块,将无法使用modules命令启用和禁用配置。要启用filebeat.yml配置文件中的特定模块,可以将条目添加到filebeat.modules列表中

    filebeat.modules:
      - module: apache2
      - module: nginx

指定变量设置
通过在文件中指定变量设置

    - module: apache2
      # Access logs
      access:
        enabled: true
        var.paths: ["/var/log/httpd/access_log*"]
      # Error logs
      error:
        enabled: true
        var.paths: ["/var/log/httpd/error_log*"]    

在命令行中覆盖设置

filebeat --modules apache2 -M "apache.access.var.paths=["/var/log/httpd/access_log*"]" -M "apache.error.var.paths=["/var/log/httpd/error_log*"]"

实时重新加载

可以配置Filebeat以在发生更改时动态地重新加载配置文件。该功能仅适用于prospector和模块配置文件,要配置此功能,请指定一个路径(Glob)来监视配置更改。 当Glob找到的文件发生变化时,根据配置文件的变化启动和停止新的prospectors and/or模块。
此功能在容器环境中特别有用,其中一个容器用于在同一主机上的其他容器中运行服务的日志。要启用动态配置重新加载,请在filebeat.config.prospectors或filebeat.config.modules部分下指定路径和重新加载选项,如

filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml     #定义要检查更改的文件的Glob
  reload.enabled: true          #设置为true时,启用动态配置重新加载。
  reload.period: 10s            #指定文件检查更改的频率。 不要将周期设置为小于1秒,因为文件的修改时间通常以秒为单位存储。

配置日志输出

官方文档:https://www.elastic.co/guide/en/beats/filebeat/current/configuration-logging.html
filebeat.yml配置文件的日志记录部分包含用于配置Beats日志记录输出的选项。 日志系统可以将日志写入系统日志或旋转日志文件。 如果未明确配置日志记录,则在Windows系统上使用文件输出,在Linux和OS X上使用syslog输出。

logging.level: info         #输出的日志级别debug, info, warning, error, or critical
logging.to_files: true      #如果为true,则将所有日志记录输出写入文件。 当达到日志文件大小限制时,日志文件会自动旋转
logging.to_syslog: false    #如果为true,则将所有日志输出写入syslog
logging.files:
  path: /var/log/filebeat
  name: filebeat
  keepfiles: 7
  permissions: 0644 

常见实践架构

(1)filebeat-->logstash-->elasticsearch-->kibana
这里写图片描述
(2)filebeat-->elasticsearch-->kibana
这里写图片描述
Ingest Node:5.x新增的一个节点类型:

  • 在数据写入es前(bulk/index操作)对数据进行处理
  • 可设立独立的ingest node专门进行数据转换处理 node.ingest: true
  • api endpoint为pipeline

Ingest Node - Pipeline:

Pipeline由一系列processor组成,类似logstash的filter plugin:
Processor对应logstash的filter Plugin,基本都涵盖了:Convert、Grok、Date、Gsub、Join、Json、Remove、Script

{
    "description":"...",
    "processors": [...]
}

Pipeline的API比较简单,主要有如下四个:

  • 创建PUT
  • 获取GET
  • 删除DELETE
  • 模拟调试SIMULATE

API示例:

PUT _ingest/pipeline/test
{
  "description": "for test",
  "processors": [
    {
      "set": {
        "field": "name",
        "value": "alfred"
      }
    }
  ]
}

GET _ingest/pipeline/test

DELETE _ingest/pipeline/test

GET _ingest/pipeline/test/_simulate
{
  "docs": [
      {
        "_source":{
          "message":"my message"
        }
      }
    ]
}

注意处理解析错误的情况:
这里写图片描述
Pipeline实践处理nginx日志:
日志处理中常用到两个es的插件:

./bin/elasticsearch-plugin install ingest-geoip
./bin/elasticsearch-plugin install ingest-user-agent

插件必须安装在群集中的每个节点上,并且每个节点必须在安装后重新启动(supervisor)。

PUT  _ingest/pipeline/nginx_log
{
  "description": "Pipeline for parsing Nginx access logs. Requires the geoip and user_agent plugins.",
  "processors": [{
    "grok": {
      "field": "message",
      "patterns":[
        "\"?%{IP_LIST:nginx.access.remote_ip_list} - %{DATA:nginx.access.user_name} \\[%{HTTPDATE:nginx.access.time}\\] \"%{WORD:nginx.access.method} %{DATA:nginx.access.url} HTTP/%{NUMBER:nginx.access.http_version}\" %{NUMBER:nginx.access.response_code} %{NUMBER:nginx.access.body_sent.bytes} \"%{DATA:nginx.access.referrer}\" \"%{DATA:nginx.access.agent}\""
        ],
      "pattern_definitions": {
        "IP_LIST": "%{IP}(\"?,?\\s*%{IP})*"
      },
      "ignore_missing": true
    }
  }, {
    "split": {
      "field": "nginx.access.remote_ip_list",
      "separator": "\"?,?\\s+"
    }
  }, {
    "script": {
      "lang": "painless",
      "inline": "boolean isPrivate(def ip) { try { StringTokenizer tok = new StringTokenizer(ip, '.'); int firstByte = Integer.parseInt(tok.nextToken());       int secondByte = Integer.parseInt(tok.nextToken());       if (firstByte == 10) {         return true;       }       if (firstByte == 192 && secondByte == 168) {         return true;       }       if (firstByte == 172 && secondByte >= 16 && secondByte <= 31) {         return true;       }       if (firstByte == 127) {         return true;       }       return false;     } catch (Exception e) {       return false;     }   }   def found = false;   for (def item : ctx.nginx.access.remote_ip_list) {     if (!isPrivate(item)) {       ctx.nginx.access.remote_ip = item;       found = true;       break;     }   }   if (!found) {     ctx.nginx.access.remote_ip = ctx.nginx.access.remote_ip_list[0];   }"
      }
  }, {
    "remove":{
      "field": "message"
    }
  }, {
    "rename": {
      "field": "@timestamp",
      "target_field": "read_timestamp"
    }
  }, {
    "date": {
      "field": "nginx.access.time",
      "target_field": "@timestamp",
      "formats": ["dd/MMM/YYYY:H:m:s Z"]
    }
  }, {
    "remove": {
      "field": "nginx.access.time"
    }
  }, {
    "user_agent": {
      "field": "nginx.access.agent",
      "target_field": "nginx.access.user_agent"
    }
  }, {
    "remove": {
      "field": "nginx.access.agent"
    }
  }, {
    "geoip": {
      "field": "nginx.access.remote_ip",
      "target_field": "nginx.access.geoip"
    }
  }],
  "on_failure" : [{
    "set" : {
      "field" : "error.message",
      "value" : "{{ _ingest.on_failure_message }}"
    }
  }]
}

nginx_log的写法其实就是filebeat中nginx模块ingest的配置:
nginx/access/ingest/default.json

测试:

GET _ingest/pipeline/nginx_log/_simulate
{
  "docs": [
      {
        "_source":{
          "message":"""93.180.71.3 - - [30/Jun/2018:15:52:27 +0800] "GET /favicon.ico HTTP/1.1" 404 3650 "http://192.168.20.102/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-""",
          "@timestamp":""
        }
      }
    ]
}

这里写图片描述

案例:使用apache2模块

解析由Apache HTTP服务器创建的访问和错误日​​志

当你运行这个模块时,它会在下面执行一些任务:

  • 设置日志文件的默认路径(可以覆盖默认值)
  • 确保每个多行日志事件都作为单个事件发送
  • 使用摄入节点来解析和处理日志行,将数据整形为适合在Kibana中可视化的结构
  • 部署仪表板以可视化日志数据

兼容性:
该模块需要 ingest-user-agent和 ingest-geoip Elasticsearch插件。

/usr/local/elk/elasticsearch-6.2.3/bin/elasticsearch-plugin install ingest-geoip
/usr/local/elk/elasticsearch-6.2.3/bin/elasticsearch-plugin install ingest-user-agent
#查看安装的插件
/usr/local/elk/elasticsearch-6.2.3/bin/elasticsearch-plugin list  

插件必须安装在群集中的每个节点上,并且每个节点必须在安装后重新启动(supervisor)。

设置并运行模块:
在执行这些步骤之前,确保Elasticsearch和Kibana安装完成并正在运行,并且Elasticsearch已准备好从Filebeat接收数据。

============= Kibana ================
setup.kibana:
  host: "192.168.20.60:5601"
============= Outputs ===========
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["192.168.20.60:9200"]

1.启用模块:

./filebeat modules enable apache2   

2.查看启用和禁用模块的列表:

./filebeat modules list

3.建立初始环境:

./filebeat setup -e

该setup命令加载用于写入Elasticsearch的推荐索引模板,并部署示例仪表板以在Kibana中可视化数据。这是一次性设置步骤。
-e标志是可选的,并将输出发送到标准错误而不是syslog

4.配置模块:
方法1:通过在文件中指定变量设置

    - module: apache2
      # Access logs
      access:
        enabled: true
        var.paths: ["/var/log/httpd/access_log*"]
      # Error logs
      error:
        enabled: true
        var.paths: ["/var/log/httpd/error_log*"]    

方法二:在命令行中覆盖设置

filebeat --modules apache2 -M "apache.access.var.paths=["/var/log/httpd/access_log*"]" -M "apache.error.var.paths=["/var/log/httpd/error_log*"]"

5.运行Filebeat:

/etc/init.d/filebeat start

6.探索kibana中的数据
打开浏览器并导航到Kibana中的仪表板概览:
http://192.168.20.60:5601/app/kibana#/dashboard/。在搜索框中 输入apache2,然后打开仪表板并浏览解析日志的可视化。

如果启用安全性,请使用设置安全性时使用的Kibana用户名和密码登录。
如果在Kibana中看不到数据,可以尝试将日期范围更改为更大的范围。默认情况下,Kibana显示最近15分钟

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值