ElasticSearch Filebeat常用参数整合

ElasticSearch Filebeat



前言

Elastic Stack传统上由三个主要组件ELKB(Elasticsearch,Logstash、Kibana和Beats)。
beats下面有几个框架(Filebeat、Packetbeat、Metricbeat、Heartbeat、Auditbeat、Winlogbeat、Functionbeat、)

官方配置文档解析


Beats与Logstash

区别一:
Beats是轻量级(资源高效,无依赖性,小型)和开放源代码日志发送程序的集合。
Logstash是重量级的任务线程,执行需要耗费大量资源

区别二:
Filebeat采集配置更加便捷:可以同时控制多个采集点开关。(使用Filebeat的enabled字段等)

Filebeat工作原理

Filebeat由两个主要组件组成:prospectorharvester

harvester:

  • 负责读取单个文件的内容。
  • 如果文件在读取时被删除或重命名,Filebeat将继续读取文件

prospector:

  • prospector负责管理harvester并找到所有要读取的文件来源。
  • 如果输入类型为日志,则查找器将查找路径匹配的所有文件,并为每个文件启动一harvester。
  • Filebeat目前支持两种prospector类型:log和stdin。

Filebeat如何保持文件的状态?

  • Filebeat 保存每个文件的状态并经常将状态刷新到磁盘上的注册文件中。

  • 该状态用于记住harvester正在读取的最后偏移量,并确保发送所有日志行。

  • 如果输出(例如Elasticsearch或Logstash)无法访问,Filebeat会跟踪最后发送的行,并在输出再次可用时继续读取文件

  • 在Filebeat运行时,每个prospector内存中也会保存的文件状态信息,当重新启动Filebeat时,将使用注册文件的数据来重建文件状态,Filebeat将每个harvester在从保存的最后偏移量继续读取

  • 文件状态记录在data/registry文件中

Filebeat使用步骤

Filebeat的处理流程

  • 输入Input
  • 处理Filter
  • 输出Output

Filebeat配置

主要是关于filebeat.inputs,和outputs两个的配置。

filebeat.input(prospectors)配置

官方博客

Filebeat支持的输入类型

  • AWS CloudWatch
  • AWS S3
  • Azure Event Hub
  • Cloud Foundry
  • Container
  • Docker
  • GCP Pub/Sub
  • HTTP Endpoint
  • HTTP JSON
  • Kafka
  • Log
  • MQTT
  • NetFlow
  • Office 365 Management Activity API
  • Redis
  • Stdin
  • Syslog
  • TCP
  • UDP

inputs主要使用的几个配置项:

  • type:输入类型
  • paths:必选项,读取文件的路径,基于glob匹配语法。
  • enabled:是否启用该模块。
  • encoding:指定编码集,避免中文乱码 使用plain和utf-8都是可以处理中文日志的。
  • exclude_lines: 排除匹配列表中的正则表达式(不输出该匹配的行)。
  • include_lines:包含匹配列表中的正则表达式(只输出该匹配的行),默认关闭。
  • exclude_files: 排除的文件,匹配正则表达式的列表。
  • tags:Filebeat在每个已发布事件的标记字段中包含的标记列表。
  • fields: 可选的附加字段。这些字段可以自由选择,添加附加信息到抓取的日志文件进行过滤。最终会在输出的文件格式新增一对键值对。
  • fields_under_root 如果该选项设置为true,则新增fields成为顶级目录,而不是将其放在fields目录下。自定义的field会覆盖filebeat默认的field。
  • tail_files:如果设置为true,Filebeat从文件尾开始监控文件新增内容,把新增的每一行文件作为一个事件依次发送,而不是从文件开始处重新发送所有内容。
  • scan_frequency:10s #prospector扫描新文件的时间间隔,默认10秒
  • max_bytes:10485760 #单文件最大收集的字节数,单文件超过此字节数后的字节将被丢弃,默认10MB,需要增大,保持与日志输出配置的单文件最大值一致即可
  • multiline.pattern: 多行合并匹配规则,匹配正则表达式。
  • multiline.match:匹配可以设置为“after”或“before”。它用于定义是否应该将行追加到模式 中在之前或之后匹配的,或者只要模式没有基于negate匹配。注意:在Logstash中,After 等同于previous, before等同于next.
  • multiline.negate: 定义模式下的模式是否应该被否定。默认为false。这个配置有点绕, 其实就是负负得正,如果符合上面的就配置false,否则就配置true。
  • multiline.timeout: 表示超时时间,如果超过timeout还没有新的一行日志产生,则自动结束当前的多行、形成一条日志发出去。

借鉴博客

input常用参数解析

Filebeat的高级配置详解借鉴博客
借鉴博客
借鉴博客

filebeat.inputs:
- type: log ①
  paths:
    - /var/log/system.log
    - /var/log/wifi.log
- type: log ②
  paths:
    - "/var/log/apache2/*"
  fields:
    apache: true
  fields_under_root: true

①表示从system.log和wifi.log收集日志

②表示收集apache2文件夹下的所有内容,并且使用fileds配置项将apache字段添加到输出中的根节点

paths:待收集日志的路径列表,可以为每行指定一个路径,每行以破折号(-)开头。Filebeat会为它在指定路径下找到的每个文件启动一个harvester(收集器)

multiline : 例如配置如下:

multiline.pattern:'^[[:space:]]+'
multiline.negate: false
multiline.match: after

multiline.negate默认为false即逻辑不取反,这时只有符合multiline.pattern匹配条件的日志才会被合并
此时以空格开头的日志会被合并到上一行后面,如以下的日志采集可使用

Caused by: java.io.IOException: null
at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:105) ~[amqp-client-4.0.3.jar:4.0.3]
	at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:101) ~[amqp-client-4.0.3.jar:4.0.3]

把后面两行以空格开头的日志合并到第一行上,整体在一起算一条完整的日志

multiline.negate为true,表示逻辑取反,这是只有不符合multiline.pattern匹配条件的日志才会被合并,如上例 将会匹配不以空格开始的行,合并到上一行

fields:可选字段,您可以指定将附加信息添加到输出中。例如,可以添加可用于筛选日志数据的字段。字段可以是标量值、数组、字典或它们的任何嵌套组合。
fields_under_root: 将自定义字段显示为顶级字段

fields: 
  level: debug

输出的内容如下:
在这里插入图片描述

fields: 
	level: debug 
fields_under_root: true

输出如下
在这里插入图片描述

使用 TCP type 来收集日志

filebeat.inputs:
# 添加的部分
- type: tcp
  max_message_size: 10MiB
  host: "0.0.0.0:9900"

在上面,我们添加了一个 TCP 的输入。它监听的地址是 0.0.0.0:9900。

output 输出配置

Filebeat支持的输出类型

  • ElasticSearch
  • LogStash
  • Kafka
  • Redis
  • File
  • Console
  • Cloud

原博客

Elasticsearch

版本不同添加的参数不同

示例

output.elasticsearch:
  hosts: ["https://localhost:9200"]
  index: "filebeat-%{[beat.version]}-%{+yyyy.MM.dd}"
  ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
  ssl.certificate: "/etc/pki/client/cert.pem"
  ssl.key: "/etc/pki/client/cert.key"

使用%{[]}可以引用事件中的属性。

如果没有指定index,默认会按照filebeat-版本号-日期格式生成一个索引,默认索引格式:

在这里插入图片描述

相关配置参数

  • enable: 是否启用这个output配置
  • hosts: 指定es主机列表。eg:hosts: [“10.45.3.2:9220”, “10.45.3.1:9230”]
  • compression_level: gzip压缩级别。默认为0禁用压缩。压缩级别必须在1(最佳速度)到9(最佳压缩)的范围内。增加压缩级别会减少网络使用,但会增加cpu使用。
  • escape_html: 是否将字符串中的html转义,默认true。
  • worker: 为每个es节点的开启的工作线程数量
  • username: 用户名
  • password: 密码
  • parameters: http url参数字典
  • protocol: http或https协议
  • path: es的url访问路径。
  • headers: 自定义请求头
  • index: 索引名称。默认是filebeat-%{[beat.version]}-%{+yyyy.MM.dd},如果要修改索引名必须配置选项 setup.template.name 和 setup.template.pattern
  • indices: 这个参数可以根据一些条件,来写入不同的索引
  • bulk_max_size: 单个es处理的最大事件数。默认值为50
  • backoff.init: 连接es失败时,等待多少秒进行第一次重连。每重连一次按照指数的方式增加尝试连接的时间间隔,直到backoff.max秒
  • backoff.max: 网络错误后,在尝试连接到es之前等待的最大秒数。缺省值为60秒。
  • timeout: http请求的超时时间
  • ssl: ssl相关配置.https://www.elastic.co/guide/en/beats/filebeat/6.8/configuration-ssl.html

index 参数使用 :
如 将索引名称改为elk-file

output.elasticsearch.index: "elk-file-%{[agent.version]}-%{+yyyy.MM.dd}"
setup.template.name: "elk-file"
setup.template.pattern: "elk-file-*"
setup.ilm.enabled: false

从7.0版本开始,索引生命周期管理(ILM)默认是开启状态,当开启状态时候setup.template.name和setup.template.pattern两个参数不生效,所以还需要配置关闭ILM,即setup.ilm.enabled: false

索引生命周期管理(ILM)默认是开启状态,在不关闭ILM情况下更改索引名称。在配置文件filebeat.yml添加以下选项即可。

setup.ilm.enabled: auto
setup.ilm.rollover_alias: "elk-file"
setup.ilm.pattern: "{now/d}-000001" 

重启后,索引名称为elk-file-yyyy.MM.dd-000001 格式。

indices 参数使用

indices 包含的可选参数 :

  • index: 索引名称
  • mappings: 这里是一个字典,会与index的值做匹配,匹配的值就是最后的索引名
  • default: 默认值
  • when: 条件

下面举一些例子:

output.elasticsearch:
  hosts: ["http://localhost:9200"]
  indices:
    - index: "warning-%{[beat.version]}-%{+yyyy.MM.dd}"
      when.contains:  # 如果一个事件中的message字段包含"WARN" ,索引名称就是"warning-%{[beat.version]}-%{+yyyy.MM.dd}"
        message: "WARN"
    - index: "error-%{[beat.version]}-%{+yyyy.MM.dd}"
      when.contains: # 如果一个事件中的message字段包含"ERR" ,索引名称就是"error-%{[beat.version]}-%
        message: "ERR"
output.elasticsearch:
  hosts: ["http://localhost:9200"]
  indices:
    - index: "%{[fields.log_type]}" 
    # 如果事件中"fields.log_type"字段的值是critical,那么索引就是sev1,如果是normal那么索引名就是sev2,没有匹配的项索引名就是sev3;通过 inputs下的fields指定自定义属性与值
      mappings:
        critical: "sev1"
        normal: "sev2"
      default: "sev3"

简单的输出模板

#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["localhsot:9200"]
  index: "ngnix-%{+yyyy.MM}"

#因为我是分析ngnix 所以...  
setup.template.name: "ngnix" 
#这是指定分析索引为ngnix-开头的所有
setup.template.pattern: "ngnix-*" 
#禁用自定义模板
setup.template.enabled: false 
#覆盖原来的模板
setup.template.overwrite: true
#停用ilm 这一步很重要
setup.ilm.enabled: false
Logstash

示例

output.logstash:
  hosts: ["127.0.0.1:5044"]

每个事件都包含如下字段

{
    ...
    "@metadata": { 
      "beat": "filebeat", 
      "version": "6.8.14" 
      "type": "doc" 
    }
}

配置参数

  • enabled: 是否启用配置
  • hosts: 指定logstash主机列表。禁用负载均衡后,如果配置了多台主机,则随机选择一台主机(无优先级)。如果一个主机变得不可达,另一个主机被随机选择。
  • compression_level: gzip压缩级别。默认为0禁用压缩。压缩级别必须在1(最佳速度)到9(最佳压缩)的范围内。增加压缩级别会减少网络使用,但会增加cpu使用。
  • escape_html: 是否将字符串中的html转义,默认true。
  • worker: 为每个logstash节点开启的工作线程数量。
  • loadbalance: 是否启用负载均衡
  • ttl: 与logstash建立连接的存活时间
  • bulk_max_size: 单个logstash处理的最大事件数。默认值为50
  • backoff.init: 连接logstash失败时,等待多少秒进行第一次重连。每重连一次按照指数的方式增加尝试连接的时间间隔,直到backoff.max秒
    backoff.max: 网络错误后,在尝试连接到logstash之前等待的最大秒数。缺省值为60秒。
filebeat采集日志发送给logstash再转ElasticSearch(不解析)

原文

filebeat.yml 配置如下:

filebeat.inputs:
- type: log
  tail_files: true
  scan_frequency: 5s
  backoff: 1s
  max_backoff: 10s
  paths:
      - /var/log/messages*
  fields:
    type: messages
    ip: 192.168.139.129
  fields_under_root: true

- type: log
  tail_files: true
  scan_frequency: 5s
  backoff: 1s
  max_backoff: 10s
  paths:
      - /var/log/secure*
  fields:
    type: secure
    ip: 192.168.139.129
  fields_under_root: true

output.logstash:
  hosts: ["192.168.139.128:5044"]

logstash.conf 配置如下(不解析):

input {
        beats {
                host => '0.0.0.0'
                port => 5044 
        }
}

output{
  if [type] == "secure" {
    elasticsearch {
      hosts => ["http://192.168.139.128:9200"]
      index => "secure-%{+YYYY.MM.dd}"
    }
  }
  else if [type] == "messages" {
    elasticsearch {
      hosts => ["http://192.168.139.128:9200"]
      index => "messages-%{+YYYY.MM.dd}"
    }
  }
}
filebeat采集日志发送给logstash再转ElasticSearch(解析)

filebeat.yml 配置如下:

filebeat.inputs:
- type: log
  tail_files: true
  scan_frequency: 5s
  backoff: 1s
  max_backoff: 10s
  paths:
      - /var/log/messages*
  fields:
    type: messages
    ip: 192.168.139.129
  fields_under_root: true

- type: log
  tail_files: true
  scan_frequency: 5s
  backoff: 1s
  max_backoff: 10s
  paths:
      - /var/log/secure*
  fields:
    type: secure
    ip: 192.168.139.129
  fields_under_root: true

output.logstash:
  hosts: ["192.168.139.128:5044"]

logstash.conf 配置如下(解析):

input {
        beats {
                host => '0.0.0.0'
                port => 5044 
        }
}

filter {
 if [type] == "access" {
    grok {
        match => {
            "message" => '(?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - (?<user>\S+) \[(?<timestamp>[^ ]+ \+[0-9]+)\] "(?<requesttype>[A-Z]+) (?<requesturl>[^
 ]+) HTTP/\d.\d" (?<status>\d+) (?<bodysize>\d+) "(?<url>\S+)" "[^"]+"'}
#移除不需要的字段
       remove_field => ["message","@version","path"] 
    }
    date {
        match => ["requesttime", "dd/MMM/yyyy:HH:mm:ss Z"]
        target => "@timestamp"
    }
  }
}

output{
  if [type] == "secure" {
    elasticsearch {
      hosts => ["http://192.168.139.128:9200"]
      index => "secure-%{+YYYY.MM.dd}"
    }
  }
  else if [type] == "messages" {
    elasticsearch {
      hosts => ["http://192.168.139.128:9200"]
      index => "messages-%{+YYYY.MM.dd}"
    }
  }
  else if [type] == "access" {
    elasticsearch {
      hosts => ["http://192.168.139.128:9200"]
      index => "access-%{+YYYY.MM.dd}"
    }
  }
}
Redis
output.redis:
 hosts: ["192.168.136.101:6379"]
 key: "filebeat-redis"
 db: 0
 timeout: 5

hosts参数指定了Redis的IP和端口号,key参数指定了在Redis中插入的索引,db指定了Redis的库,timeout参数则指定了超时时间。

其他参数 :

  • enabled:true 启用模块
  • hosts:[“localhost:6379”]
output.redis:
  enabled: true
  codec.json:
    pretty: false
    escape_html: false
  hosts: ["localhost:6379"]
  key: filebeat
  password: '*****'
  db: 0

  ##发布事件的Redis数据类型。如果数据类型为list,则使用RPUSH命令;如果数据类型为channel,则使用PUBLISH命令。默认值为list。
  datatype: list

  ##发布事件到每个Redis的工作线程数。将此设置与loadbalance选项一起使用。例如,如果有2台主机和3台工作机,则总共启动6台工作机(每个主机3台)。
  worker: 1

  #如果设置为true并且配置了多个hosts或worker,则会将发布的事件负载平衡到所有Redis主机上。
  #如果设置为false,则只向一个主机发送所有事件(随机确定),如果当前选定的主机无法访问,则将切换到另一个主机。
  #默认值为true。
  loadbalance: true

  timeout: 5s
  ##发布失败后重试发布事件的次数。在指定的重试次数之后,通常会删除事件。
  max_retries: 3

  ##网络错误后等待多久尝试重新连接到Redis。
  backoff.init: 1s

  ##网络错误后尝试连接到Redis之前等待的最大秒数。默认值为60秒。
  #backoff.max: 60s

  #单个Redis请求或管道中要批量处理的最大事件数。默认值为2048。
  bulk_max_size: 2048
Kafka

示例代码

output.kafka:
  hosts: ["kafka1:9092", "kafka2:9092", "kafka3:9092"]
  # 指定主题
  topic: '%{[fields.log_topic]}'
  partition.round_robin:
    reachable_only: false
  required_acks: 1
  compression: gzip
  max_message_bytes: 1000000

这个output适用于0.11到2.0.0之间的所有Kafka版本。旧版本也可以工作,但不在维护。

配置参数

  • enable: 是否启用配置

  • hosts: kafka broker节点地址列表

  • version: kafka的版本号。0.8.2.0 ~ 2.0.0。默认1.0.0

  • worker: 为每个kafka节点开启的工作线程数量。

  • username: kafka用户名

  • password: kafka密码

  • topic: 指定主题

  • topics: 这个和上面es中的indices类似

    • topic: 主题名称
    • mappings: 这里是一个字典,会与topic的值做匹配,匹配的值就是最后的索引名
    • default: 默认值
    • when: 条件
  • key: 事件的key,用于计算hash值

  • partition: 指定输出kafka分区策略,三个选项random,round_robin,hash. 默认hash

    • random.group_events: 向一个分区写入事件的数量,达到数量后会随机选择一个新分区。默认值是1,即在每个事件之后随机选择一个新分区。
      round_robin.group_events: 向一个分区写入事件的数量,达到数量后会选择下一个分区。默认值是1,即在每个事件之后选择下一个分区。
    • hash.hash: 用于计算分区hash值的属性列表,没有定义则使用key设置的值
    • hash.random: 如果无法计算hash或key,则随机分发事件。
    • random|round_robin|hash.reachable_only: 默认情况下,所有分区策略将尝试向所有分区发布事件。如果filebeat无法访问分区的leader,output可能会阻塞。如果 - reachable_only设置为true,事件将只发布到可用分区。
  • codec: 输出编码格式,默认json

  • metadata: Kafka元数据更新相关设置。metadata信息brokers, topics, partition, 和活动的leaders等信息

  • refresh_frequency: 元数据刷新间隔。默认为10分钟。

  • retry.max: 集群在leader选举时重试读取元数据次数。缺省值是3。

  • retry.backoff: 重试时间间隔。

  • bulk_max_size: 单个kafka处理的最大事件数。默认值为50

  • timeout: 等待kafka brokers的响应时间。默认30s

  • broker_timeout:

  • channel_buffer_size: 每个Kafka broker输出管道中缓冲的消息数。缺省值是256。

  • keep_alive: 连接的存活时间,默认为0,禁用保持活动连接状态

  • compression: 压缩类型,none、snappy、lz4、gzip。默认gzip

  • compression_level: gzip压缩级别。设置为0禁用压缩。压缩级别必须在1(最佳速度)到9(最佳压缩)的范围内。增加压缩级别会减少网络使用,但会增加cpu使用。默认4

  • max_message_bytes: JSON消息的最大允许大小。超出的消息将被删除。缺省值是1000000(字节)。此值应小于kafka配置中broker的message.max.bytes参数

  • required_acks: kafka的响应返回值,0位无等待响应返回,继续发送下一条消息;1表示等待本地提交(leader broker已经成功写入,但follower未写入),-1表示等待所有副本的提交,默认为1

  • ssl: ssl相关配置.https://www.elastic.co/guide/en/beats/filebeat/6.8/configuration-ssl.html

File

配置filebeat的输出方式为文件

# 采集配置
filebeat.inputs:     #收集日志
- type: log         #类型
  enabled: true     #始终收集
  paths:
    - /etc/log/*.log    
# 输出配置
output.file:
  path: "/tmp/filebeat"  #  输出路径
  filename: filebeat    # 输出文件名
Console
output.console:
  enabled: true
  codec.json:
    pretty: false
    escape_html: false

Filebeat 常用模板

#从input读取事件源,经过相应解析和处理之后,从output输出到目标存储库(elasticsearch或其他)。
#输入可以从Log、Syslog、Stdin、Redis、UDP、Docker、TCP、NetFlow输入,然后可以输出到Elasticsearch、Logstash、Kafka、Redis、File、Console、Cloud。

############################# Filebeat ######################################
filebeat:
  prospectors:
    -
      # 指定要监控的日志,可以指定具体得文件或者目录
      paths:
        - /var/log/*.log  (这是默认的)(自行可以修改)(比如我放在/home/hadoop/app.log里)
      # 指定被监控的文件的编码类型,使用plain和utf-8都是可以处理中文日志的
      #encoding: plain
      # 指定文件的输入类型log(默认)或者stdin
      input_type: log
      # 在输入中排除符合正则表达式列表的那些行。
      # exclude_lines: ["^DBG"]
      # 包含输入中符合正则表达式列表的那些行(默认包含所有行),include_lines执行完毕之后会执行exclude_lines
      # include_lines: ["^ERR", "^WARN"]
      # 忽略掉符合正则表达式列表的文件
      # exclude_files: [".gz$"]
      # 向输出的每一条日志添加额外的信息,比如“level:debug”,方便后续对日志进行分组统计。
      # 默认情况下,会在输出信息的fields子目录下以指定的新增fields建立子目录,例如fields.level
      # 这个得意思就是会在es中多添加一个字段,格式为 "filelds":{"level":"debug"}
      #fields:
      #  level: debug
      #  review: 1
      # 如果该选项设置为true,则新增fields成为顶级目录,而不是将其放在fields目录下。
      # 自定义的field会覆盖filebeat默认的field
      # 如果设置为true,则在es中新增的字段格式为:"level":"debug"
      #fields_under_root: false
      # 可以指定Filebeat忽略指定时间段以外修改的日志内容,比如2h(两个小时)或者5m(5分钟)。
      #ignore_older: 0
      # 如果一个文件在某个时间段内没有发生过更新,则关闭监控的文件handle。默认1h
      #close_older: 1h
      # 设定Elasticsearch输出时的document的type字段 可以用来给日志进行分类。Default: log
      #document_type: log
      # Filebeat以多快的频率去prospector指定的目录下面检测文件更新(比如是否有新增文件)
      # 如果设置为0s,则Filebeat会尽可能快地感知更新(占用的CPU会变高)。默认是10s
      #scan_frequency: 10s
      # 每个harvester监控文件时,使用的buffer的大小
      #harvester_buffer_size: 16384
      # 日志文件中增加一行算一个日志事件,max_bytes限制在一次日志事件中最多上传的字节数,多出的字节会被丢弃,default is 10MB.
      #max_bytes: 10485760
      # 适用于日志中每一条日志占据多行的情况,比如各种语言的报错信息调用栈
      #multiline:
        # 多行日志开始的那一行匹配的pattern
        #pattern: ^\[
        # 是否需要对pattern条件转置使用,不翻转设为true,反转设置为false。  【建议设置为true】
        #negate: false
        # 匹配pattern后,与前面(before)还是后面(after)的内容合并为一条日志
        #match: after
        # 合并的最多行数(包含匹配pattern的那一行)
        #max_lines: 500
        # 到了timeout之后,即使没有匹配一个新的pattern(发生一个新的事件),也把已经匹配的日志事件发送出去
        #timeout: 5s
      # 如果设置为true,Filebeat从文件尾开始监控文件新增内容,把新增的每一行文件作为一个事件依次发送,
      # 而不是从文件开始处重新发送所有内容
      #tail_files: false
      # Filebeat检测到某个文件到了EOF(文件结尾)之后,每次等待多久再去检测文件是否有更新,默认为1s
      #backoff: 1s
      # Filebeat检测到某个文件到了EOF之后,等待检测文件更新的最大时间,默认是10秒
      #max_backoff: 10s
      # 定义到达max_backoff的速度,默认因子是2,到达max_backoff后,变成每次等待max_backoff那么长的时间才backoff一次,
      # 直到文件有更新才会重置为backoff
      # 根据现在的默认配置是这样的,每隔1s检测一下文件变化,如果连续检测两次之后文件还没有变化,下一次检测间隔时间变为10s
      #backoff_factor: 2
      # 这个选项关闭一个文件,当文件名称的变化。#该配置选项建议只在windows
      #force_close_files: false
  # spooler的大小,spooler中的事件数量超过这个阈值的时候会清空发送出去(不论是否到达超时时间)
  #spool_size: 2048
  # 是否采用异步发送模式(实验功能)
  #publish_async: false
  # spooler的超时时间,如果到了超时时间,spooler也会清空发送出去(不论是否到达容量的阈值)
  #idle_timeout: 5s
  # 记录filebeat处理日志文件的位置的文件,默认是在启动的根目录下
  #registry_file: .filebeat
  # 如果要在本配置文件中引入其他位置的配置文件,可以写在这里(需要写完整路径),但是只处理prospector的部分
  #config_dir:
  
############################# Libbeat Config ##################################
# Base config file used by all other beats for using libbeat features

############################# Output ##########################################
output:
  elasticsearch:            #(这是默认的,filebeat收集后放到es里)(自行可以修改,比如我有时候想filebeat收集后,然后到redis,再到es,就可以注销这行)
    hosts: ["localhost:9200"]        (这是默认的,filebeat收集后放到es里)(自行可以修改,比如我有时候想filebeat收集后,然后到redis,再到es,就可以注销这行)

Filebeat输出到Logstash再输出到ElasticSearch示例

Logstash依赖于JVM,在启动的时候大家也很容易就能发现它的启动速度很慢很慢,但logstash的好处是支持很多类型的插件,支持对数据做预处理。而filebeat很轻量,前身叫logstash-forward,是使用Golang开发的,所以不需要有java依赖,也很轻量,占用资源很小,但功能也很少,不支持对数据做预处理。因此一般都是将filebeat+logstash组合使用,在每个节点部署filbeat,然后将监控的日志推送到数据缓冲层或直接推送到logstash集群内,配合redis或kafka做数据缓冲层来使用。

配置Filebeat :

filebeat.inputs:
- type: log
  paths:
    - /var/log/nginx/*.log
  fields:
    log_type: "nginx"
  json.key_under_root: true
  json.overwite_keys: true
 
- type: log
  enabled: true
  paths:
    - /var/log/elasticsearch/elasticsearch.log
  fields:
    log_type: "es"
  multiline.pattern: '^\s'
  multiline.negate: true
  multiline.match: after
 
- type: log
  enabled: true
  paths:
    - /data/ruoyi/*.log
  fields:
    log_type: "ruoyi"
  multiline.pattern: '^\s'
  multiline.negate: true
  multiline.match: after
 
output.logstash:
  enabled: true
  hosts: ["localhost:5044"]

配置 Logstash :

input {
   #从filebeat取数据,端口与filebeat配置文件一致
   beats {
     port => 5044
   }
}

filter {
    #只对nginx的json日志做json解析,系统message为其他格式,无需处理
    if [fields][log_type] == "nginx"{
      json {
         source => "message"
         remove_field => ["beat","offset","tags","prospector"] #移除字段,不需要采集
      }
      date {
        match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"] #匹配timestamp字段
        target => "@timestamp"  #将匹配到的数据写到@timestamp字段中
      }
  }
}
 
output {
       # 输出es,这的filetype就是在filebeat那边新增的自定义字段名
       if [fields][log_type] == "es" {
         elasticsearch {
            hosts => ["node1:9200","node2:9200"]
            index => "es-%{+YYYY.MM}"
        }
       } 
       if [fields][log_type] == "ruoyi" {
         elasticsearch {
            hosts => ["node1:9200","node2:9200"]
            index => "ruoyi-%{+YYYY.MM.dd}"
        }
       }
       if [fields][log_type] == "nginx" {
         elasticsearch {
            hosts => ["node1:9200","node2:9200"]
            index => "nginx-%{+YYYY.MM}"
        }       
       }
}

先启动logstash,不然的话filebeat会找不到logstash的5044端口


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值