日志数据同步工具filebeat和logstash介绍和使用

filebeat

Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash进行索引。

工作的流程图如下:

  • 启动Filebeat时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找;
  • 对于Filebeat所找到的每个日志,Filebeat都会启动收集器;
  • 每个收集器都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将聚集事件,并将聚集的数据发送到为Filebeat配置的输出。

filebeat和logstash的关系

因为logstash是jvm跑的,资源消耗比较大,所以后来作者又用golang写了一个功能较少但是资源消耗也小的轻量级的logstash-forwarder。不过作者只是一个人,加入http://elastic.co公司以后,因为es公司本身还收购了另一个开源项目packetbeat,而这个项目专门就是用golang的,有整个团队,所以es公司干脆把logstash-forwarder的开发工作也合并到同一个golang团队来搞,于是新的项目就叫filebeat了。

原理

filebeat由两个组件构成,分别是inputs(输入)和harvesters(收集器),这些组件一起工作来跟踪文件并将事件数据发送到指定的输出,harvester负责读取单个文件的内容。

harvester逐行读取每个文件,并将内容发送到输出为每个文件启动一个harvester。harvester负责打开和关闭文件,这意味着文件描述符在harvester运行时保持打开状态。如果在收集文件时删除或重命名文件,Filebeat将继续读取该文件。这样做的副作用是,磁盘上的空间一直保留到harvester关闭。默认情况下,Filebeat保持文件打开,直到达到close_inactive。

关闭harvester可以会产生的结果:

  • 文件处理程序关闭,如果harvester仍在读取文件时被删除,则释放底层资源。
  • 只有在scan_frequency结束之后,才会再次启动文件的收集。
  • 如果该文件在harvester关闭时被移动或删除,该文件的收集将不会继续。

一个input负责管理harvesters和寻找所有来源读取。如果input类型是log,则input将查找驱动器上与定义的路径匹配的所有文件,并为每个文件启动一个harvester。每个input在它自己的Go进程中运行,Filebeat当前支持多种输入类型。每个输入类型可以定义多次。日志输入检查每个文件,以查看是否需要启动harvester、是否已经在运行harvester或是否可以忽略该文件。

Q1:filebeat如何保存文件的状态?

Filebeat保留每个文件的状态,并经常将状态刷新到磁盘中的注册表文件中。该状态用于记住harvester读取的最后一个偏移量,并确保发送所有日志行。如果无法访问输出(如Elasticsearch或Logstash),Filebeat将跟踪最后发送的行,并在输出再次可用时继续读取文件。**当Filebeat运行时,每个输入的状态信息也保存在内存中。当Filebeat重新启动时,来自注册表文件的数据用于重建状态,Filebeat在最后一个已知位置继续每个harvester。**对于每个输入,Filebeat都会保留它找到的每个文件的状态。由于文件可以重命名或移动,文件名和路径不足以标识文件。对于每个文件,Filebeat存储唯一的标识符,以检测文件是否以前被捕获。

Q2:filebeat何如保证至少一次数据消费?

Filebeat保证事件将至少传递到配置的输出一次,并且不会丢失数据。是因为它将每个事件的传递状态存储在注册表文件中。在已定义的输出被阻止且未确认所有事件的情况下,Filebeat将继续尝试发送事件,直到输出确认已接收到事件为止。如果Filebeat在发送事件的过程中关闭,它不会等待输出确认所有事件后再关闭。当Filebeat重新启动时,将再次将Filebeat关闭前未确认的所有事件发送到输出。这样可以确保每个事件至少发送一次,但最终可能会有重复的事件发送到输出。通过设置shutdown_timeout选项,可以将Filebeat配置为在关机前等待特定时间。

安装

curl-L-Ohttps://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.7.0-linux-x86_64.tar.gz
tar -xzvf filebeat-7.7.0-linux-x86_64.tar.gz

配置示例文件:filebeat.reference.yml(包含所有未过时的配置项)
配置文件:filebeat.yml

基本命令

详情见官网:https://www.elastic.co/guide/en/beats/filebeat/current/command-line-options.html

export   #导出
run      #执行(默认执行)
test     #测试配置
keystore #秘钥存储
modules  #模块配置管理
setup    #设置初始环境

例如:

./filebeat test config #用来测试配置文件是否正确

输入输出

支持的输入组件:

Multilinemessages,Azureeventhub,CloudFoundry,Container,Docker,GooglePub/Sub,HTTPJSON,Kafka,Log,MQTT,NetFlow,Office365ManagementActivityAPI,Redis,s3,Stdin,Syslog,TCP,UDP(最常用的额就是log)

支持的输出组件:

Elasticsearch,Logstash,Kafka,Redis,File,Console,ElasticCloud,Changetheoutputcodec(最常用的就是Elasticsearch,Logstash)

keystore的使用

keystore主要是防止敏感信息被泄露,比如密码等,像ES的密码,这里可以生成一个key为ES_PWD,值为es的password的一个对应关系,在使用es的密码的时候就可以使用${ES_PWD}使用。

创建一个存储密码的keystore:filebeat keystore create
然后往其中添加键值对,例如:filebeatk eystore add ES_PWD
使用覆盖原来键的值:filebeat key store add ES_PWD–force
删除键值对:filebeat key store remove ES_PWD
查看已有的键值对:filebeat key store list

例如:后期就可以通过${ES_PWD}使用其值,例如:

output.elasticsearch.password:"${ES_PWD}"

filebeat.yml配置(log输入类型为例)

type: log #input类型为log
enable: true #表示是该log类型配置生效
paths:     #指定要监控的日志,目前按照Go语言的glob函数处理。没有对配置目录做递归处理,比如配置的如果是:
- /var/log/* /*.log  #则只会去/var/log目录的所有子目录中寻找以".log"结尾的文件,而不会寻找/var/log目录下以".log"结尾的文件。
recursive_glob.enabled: #启用全局递归模式,例如/foo/**包括/foo, /foo/*, /foo/*/*
encoding:#指定被监控的文件的编码类型,使用plain和utf-8都是可以处理中文日志的
exclude_lines: ['^DBG'] #不包含匹配正则的行
include_lines: ['^ERR', '^WARN']  #包含匹配正则的行
harvester_buffer_size: 16384 #每个harvester在获取文件时使用的缓冲区的字节大小
max_bytes: 10485760 #单个日志消息可以拥有的最大字节数。max_bytes之后的所有字节都被丢弃而不发送。默认值为10MB (10485760)
exclude_files: ['\.gz$']  #用于匹配希望Filebeat忽略的文件的正则表达式列表
ingore_older: 0 #默认为0,表示禁用,可以配置2h,2m等,注意ignore_older必须大于close_inactive的值.表示忽略超过设置值未更新的
文件或者文件从来没有被harvester收集
close_* #close_ *配置选项用于在特定标准或时间之后关闭harvester。 关闭harvester意味着关闭文件处理程序。 如果在harvester关闭
后文件被更新,则在scan_frequency过后,文件将被重新拾取。 但是,如果在harvester关闭时移动或删除文件,Filebeat将无法再次接收文件
,并且harvester未读取的任何数据都将丢失。
close_inactive  #启动选项时,如果在制定时间没有被读取,将关闭文件句柄
读取的最后一条日志定义为下一次读取的起始点,而不是基于文件的修改时间
如果关闭的文件发生变化,一个新的harverster将在scan_frequency运行后被启动
建议至少设置一个大于读取日志频率的值,配置多个prospector来实现针对不同更新速度的日志文件
使用内部时间戳机制,来反映记录日志的读取,每次读取到最后一行日志时开始倒计时使用2h 5m 来表示
close_rename #当选项启动,如果文件被重命名和移动,filebeat关闭文件的处理读取
close_removed #当选项启动,文件被删除时,filebeat关闭文件的处理读取这个选项启动后,必须启动clean_removed
close_eof #适合只写一次日志的文件,然后filebeat关闭文件的处理读取
close_timeout #当选项启动时,filebeat会给每个harvester设置预定义时间,不管这个文件是否被读取,达到设定时间后,将被关闭
close_timeout 不能等于ignore_older,会导致文件更新时,不会被读取如果output一直没有输出日志事件,这个timeout是不会被启动的,
至少要要有一个事件发送,然后haverter将被关闭
设置0 表示不启动
clean_inactived #从注册表文件中删除先前收获的文件的状态
设置必须大于ignore_older+scan_frequency,以确保在文件仍在收集时没有删除任何状态
配置选项有助于减小注册表文件的大小,特别是如果每天都生成大量的新文件
此配置选项也可用于防止在Linux上重用inode的Filebeat问题
clean_removed #启动选项后,如果文件在磁盘上找不到,将从注册表中清除filebeat
如果关闭close removed 必须关闭clean removed
scan_frequency #prospector检查指定用于收获的路径中的新文件的频率,默认10s
tail_files:#如果设置为true,Filebeat从文件尾开始监控文件新增内容,把新增的每一行文件作为一个事件依次发送,
而不是从文件开始处重新发送所有内容。
symlinks:#符号链接选项允许Filebeat除常规文件外,可以收集符号链接。收集符号链接时,即使报告了符号链接的路径,
Filebeat也会打开并读取原始文件。
backoff: #backoff选项指定Filebeat如何积极地抓取新文件进行更新。默认1s,backoff选项定义Filebeat在达到EOF之后
再次检查文件之间等待的时间。
max_backoff: #在达到EOF之后再次检查文件之前Filebeat等待的最长时间
backoff_factor: #指定backoff尝试等待时间几次,默认是2
harvester_limit:#harvester_limit选项限制一个prospector并行启动的harvester数量,直接影响文件打开数

tags #列表中添加标签,用过过滤,例如:tags: ["json"]
fields #可选字段,选择额外的字段进行输出可以是标量值,元组,字典等嵌套类型
默认在sub-dictionary位置
filebeat.inputs:
fields:
app_id: query_engine_12
fields_under_root #如果值为ture,那么fields存储在输出文档的顶级位置

multiline.pattern #必须匹配的regexp模式
multiline.negate #定义上面的模式匹配条件的动作是 否定的,默认是false
假如模式匹配条件'^b',默认是false模式,表示讲按照模式匹配进行匹配 将不是以b开头的日志行进行合并
如果是true,表示将不以b开头的日志行进行合并
multiline.match # 指定Filebeat如何将匹配行组合成事件,在之前或者之后,取决于上面所指定的negate
multiline.max_lines #可以组合成一个事件的最大行数,超过将丢弃,默认500
multiline.timeout #定义超时时间,如果开始一个新的事件在超时时间内没有发现匹配,也将发送日志,默认是5smax_procs #设置可以同时执行的最大CPU数。默认值为系统中可用的逻辑CPU的数量。name #为该filebeat指定名字,默认为主机的hostname

log -> logstash

#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
  enabled: true
  paths:  #配置多个日志路径
    - /var/logs/es_aaa_index_search_slowlog.log
    - /var/logs/es_bbb_index_search_slowlog.log
    - /var/logs/es_ccc_index_search_slowlog.log
    - /var/logs/es_ddd_index_search_slowlog.log
    #- c:\programdata\elasticsearch\logs\*
  # Exclude lines. A list of regular expressions to match. It drops the lines that are
  # matching any regular expression from the list.
  #exclude_lines: ['^DBG']

  # Include lines. A list of regular expressions to match. It exports the lines that are
  # matching any regular expression from the list.
  #include_lines: ['^ERR', '^WARN']

  # Exclude files. A list of regular expressions to match. Filebeat drops the files that
  # are matching any regular expression from the list. By default, no files are dropped.
  #exclude_files: ['.gz$']

  # Optional additional fields. These fields can be freely picked
  # to add additional information to the crawled log files for filtering
  #fields:
  #  level: debug
  #  review: 1

  ### Multiline options

  # Multiline can be used for log messages spanning multiple lines. This is common
  # for Java Stack Traces or C-Line Continuation

  # The regexp Pattern that has to be matched. The example pattern matches all lines starting with [
  #multiline.pattern: ^\[

  # Defines if the pattern set under pattern should be negated or not. Default is false.
  #multiline.negate: false

  # Match can be set to "after" or "before". It is used to define if lines should be append to a pattern
  # that was (not) matched before or after or as long as a pattern is not matched based on negate.
  # Note: After is the equivalent to previous and before is the equivalent to to next in Logstash
  #multiline.match: after


#================================ Outputs =====================================

#----------------------------- Logstash output --------------------------------
output.logstash:
  # The Logstash hosts #配多个logstash使用负载均衡机制
  hosts: ["192.168.110.130:5044","192.168.110.131:5044","192.168.110.132:5044","192.168.110.133:5044"]  
  loadbalance: true  #使用了负载均衡

  # Optional SSL. By default is off.
  # List of root certificates for HTTPS server verifications
  #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]

  # Certificate for SSL client authentication
  #ssl.certificate: "/etc/pki/client/cert.pem"

  # Client Certificate Key
  #ssl.key: "/etc/pki/client/cert.key"

启动filebeat:

./filebeat -e

logstash的配置:

input {
    
    
  beats {
    
    
    port => 5044   
  }
}

output {
    
    
  elasticsearch {
    
    
    hosts => ["http://192.168.110.130:9200"] #这里可以配置多个
    index => "query-%{yyyyMMdd}" 
  }
}

log -> elasticsearch

###################### Filebeat Configuration Example #########################

# This file is an example configuration file highlighting only the most common
# options. The filebeat.reference.yml file from the same directory contains all the
# supported options with more comments. You can use it as a reference.
#
# You can find the full configuration reference here:
# https://www.elastic.co/guide/en/beats/filebeat/index.html

# For more available modules and options, please see the filebeat.reference.yml sample
# configuration file.

#=========================== Filebeat inputs =============================

filebeat.inputs:

# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.

- type: log

  # Change to true to enable this input configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /var/logs/es_aaa_index_search_slowlog.log
    - /var/logs/es_bbb_index_search_slowlog.log
    - /var/logs/es_ccc_index_search_slowlog.log
    - /var/logs/es_dddd_index_search_slowlog.log
    #- c:\programdata\elasticsearch\logs\*

  # Exclude lines. A list of regular expressions to match. It drops the lines that are
  # matching any regular expression from the list.
  #exclude_lines: ['^DBG']

  # Include lines. A list of regular expressions to match. It exports the lines that are
  # matching any regular expression from the list.
  #include_lines: ['^ERR', '^WARN']

  # Exclude files. A list of regular expressions to match. Filebeat drops the files that
  # are matching any regular expression from the list. By default, no files are dropped.
  #exclude_files: ['.gz$']

  # Optional additional fields. These fields can be freely picked
  # to add additional information to the crawled log files for filtering
  #fields:
  #  level: debug
  #  review: 1

  ### Multiline options

  # Multiline can be used for log messages spanning multiple lines. This is common
  # for Java Stack Traces or C-Line Continuation

  # The regexp Pattern that has to be matched. The example pattern matches all lines starting with [
  #multiline.pattern: ^\[

  # Defines if the pattern set under pattern should be negated or not. Default is false.
  #multiline.negate: false

  # Match can be set to "after" or "before". It is used to define if lines should be append to a pattern
  # that was (not) matched before or after or as long as a pattern is not matched based on negate.
  # Note: After is the equivalent to previous and before is the equivalent to to next in Logstash
  #multiline.match: after


#============================= Filebeat modules ===============================

filebeat.config.modules:
  # Glob pattern for configuration loading
  path: ${
    
    path.config}/modules.d/*.yml

  # Set to true to enable config reloading
  reload.enabled: false

  # Period on which files under path should be checked for changes
  #reload.period: 10s

#==================== Elasticsearch template setting ==========================


#================================ General =====================================

# The name of the shipper that publishes the network data. It can be used to group
# all the transactions sent by a single shipper in the web interface.
name: filebeat222

# The tags of the shipper are included in their own field with each
# transaction published.
#tags: ["service-X", "web-tier"]

# Optional fields that you can specify to add additional information to the
# output.
#fields:
#  env: staging

#cloud.auth:

#================================ Outputs =====================================


#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["192.168.110.130:9200","92.168.110.131:9200"]

  # Protocol - either `http` (default) or `https`.
  #protocol: "https"

  # Authentication credentials - either API key or username/password.
  #api_key: "id:api_key"
  username: "elastic"
  password: "${ES_PWD}"   #通过keystore设置密码

logstash

介绍

官方介绍:Logstash is an open source data collection engine with real-time pipelining capabilities。简单来说logstash就是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端;与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供里很多功能强大的滤网以满足你的各种应用场景。

Logstash常用于日志关系系统中做日志采集设备,最常用于ELK(elasticsearch + logstash + kibane)中作为日志收集器使用。

Logstash 的主要优势:

  • 一个是在支持各类插件的前提下提供统一的管道进行日志处理(就是 input-filter-output 这一套);
  • 二个是灵活且性能不错

架构

Logstash 是由 JRuby 编写的,使用基于消息的简单架构,在 JVM 上运行。理念非常简单,如果说 MapReduce 框架分为 Mapper 和 Reducer 两大模块,那么 Logstash 有:

  • Collect: 数据输入。对应 input
  • Enrich: 数据处理。对应 filter
  • Transport: 数据输出。对应 output

Logstash的事件(logstash将数据流中等每一条数据称之为一个event)处理流水线有三个主要角色完成:inputs –> filters –> outputs:

  • inpust:必须,负责产生事件(Inputs generate events),常用:File、syslog、redis、beats(如:Filebeats)
  • filters:可选,负责数据处理与转换(filters modify them),常用:grok、mutate、drop、clone、geoip
  • outpus:必须,负责数据输出(outputs ship them elsewhere),常用:elasticsearch、file、graphite、statsd

安装

(1)下载Logstash

wget https://artifacts.elastic.co/downloads/logstash/logstash-5.4.1.tar.gz

(2)创建安装目录

sudo mkdir /usr/local/logstash

(3)解压缩安装文件

sudo mv logstash-5.4.1.tar.gz /usr/local/logstash/
cd /usr/local/logstash/
sudo tar -zxvf logstash-5.4.1.tar.gz

(4)测试安装是否成功

  • 测试一、快速启动,标准输入输出作为input和output,没有filter

    >cd logstash-5.4.1/
    >./bin/logstash -e 'input { stdin {} } output { stdout {} }'
    
    Sending Logstash's logs to /usr/local/logstash/logstash-5.4.1/logs which is now configured via log4j2.properties
    [2018-10-31T13:37:13,449][INFO ][logstash.setting.writabledirectory] Creating directory {
          
          :setting=>"path.queue", :path=>"/usr/local/logstash/logstash-5.4.1/data/queue"}
    [2018-10-31T13:37:13,467][INFO ][logstash.agent           ] No persistent UUID file found. Generating new UUID {
          
          :uuid=>"dcfdb85f-9728-46b2-91ca-78a0d6245fba", :path=>"/usr/local/logstash/logstash-5.4.1/data/uuid"}
    [2018-10-31T13:37:13,579][INFO ][logstash.pipeline        ] Starting pipeline {
          
          "id"=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>250}
    [2018-10-31T13:37:13,612][INFO ][logstash.pipeline        ] Pipeline main started
    The stdin plugin is now waiting for input:
    [2018-10-31T13:37:13,650][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {
          
          :port=>9600}
    
    
    ## 此时命令窗口停留在等待输入状态,键盘键入任意字符 ##
    hello world
    ## 下方是Logstash输出到效果 ##
    2018-10-31T12:21:14.401Z logstash.master hello world
    
  • 测试二、在测试一堆基础上加上codec进行格式化输出

    >./bin/logstash -e 'input{stdin{}} output{stdout{codec=>rubydebug}}'
    Sending Logstash's logs to /usr/local/logstash/logstash-5.4.1/logs which is now configured via log4j2.properties
    [2018-10-31T14:01:50,325][INFO ][logstash.pipeline        ] Starting pipeline {
          
          "id"=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>250}
    [2018-10-31T14:01:50,356][INFO ][logstash.pipeline        ] Pipeline main started
    The stdin plugin is now waiting for input:
    [2018-10-131T14:01:50,406][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {
          
          :port=>9600}
    
    ## 此时命令窗口停留在等待输入状态,键盘键入任意字符 ##
    hello world
    ## 下方是Logstash输出到效果 ##
    {
          
          
    	"@timestamp" => 2018-10-31T06:02:19.189Z,
    	"@version" => "1",
    	"host" => "chenlei.master",
    	"message" => "hello world"
    }
    

基础配置

Logstash宏观的配置文件内容格式如下:

# 输入
input {
    
    
  ...
}

# 过滤器
filter {
    
    
  ...
}

# 输出
output {
    
    
  ...
}

配置文件参考:

input {
    
    
    # 从文件读取日志信息
    file {
    
    
        path => "/var/log/error.log"
        type => "error"//type是给结果增加一个type属性,值为"error"的条目
        start_position => "beginning"//从开始位置开始读取
        # 使用 multiline 插件,传说中的多行合并
        codec => multiline {
    
    
            # 通过正则表达式匹配,具体配置根据自身实际情况而定
            pattern => "^\d"
            negate => true
            what => "previous"
        }
    }
}

#可配置多种处理规则,他是有顺序,所以通用的配置写下面
# filter {
    
    
#    grok {
    
    
#       match => {
    
     "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
     }
# }

output {
    
    
    # 输出到 elasticsearch
    elasticsearch {
    
    
        hosts => ["192.168.22.41:9200"]
        index => "error-%{+YYYY.MM.dd}"//索引名称
    }
}

上面的file可以配置多个:

file {
    
      
    type => "tms_inbound.log"  
    path => "/JavaWeb/tms2.wltest.com/logs/tms_inbound.es.*.log"  
    codec => json {
    
      
    	charset => "UTF-8"  
    }  
}  

file {
    
      
    type => "tms_outbound.log"  
    path => "/JavaWeb/tms2.wltest.com/logs/tms_outbound.es.*.log"  
    codec => json {
    
      
    	charset => "UTF-8"  
    }  
}

启动参数

常用输入插件(Input Plug)

File读取插件

文件读取插件主要用来抓取文件的变化信息,将变化信息封装成Event进程处理或者传递。

input
  file {
    
    
    path => ["/var/log/*.log", "/var/log/message"]
    type => "system"
    start_position => "beginning"
  }
}

常用参数:

Beats监听插件

Beats插件用于建立监听服务,接收Filebeat或者其他beat发送的Events;

input {
    
    
    beats {
    
    
        port => 5044
    }
}

常用参数(空 => 同上):

TCP监听插件

TCP插件有两种工作模式,“Client”和“Server”,分别用于发送网络数据和监听网络数据。

tcp {
    
    
    port => 41414
}

常用参数(空 => 同上):

Redis读取插件

用于读取Redis中缓存的数据信息。

input {
    
    
    redis {
    
    
        data_type => "list" #logstash redis插件工作方式
        key => "logstash-test-list" #监听的键值
        host => "127.0.0.1" #redis地址
        port => 6379 #redis端口号
	}
}
output {
    
    
    stdout{
    
    }
}

详细配置:

input {
    
    
    redis {
    
    
        batch_count => 1 #EVAL命令返回的事件数目
        data_type => "list" #logstash redis插件工作方式
        key => "logstash-test-list" #监听的键值
        host => "127.0.0.1" #redis地址
        port => 6379 #redis端口号
        password => "123qwe" #如果有安全认证,此项为密码
        db => 0 #redis数据库的编号
        threads => 1 #启用线程数量
	}
}

output {
    
    
    stdout{
    
    }
}

Syslog监听插件

监听操作系统syslog信息:

input{
    
    
    syslog{
    
    
        type => "system-syslog"
    	port => 514
    }
}

filter{
    
    

}

output{
    
    
    stdout{
    
    
    	codec => rubydebug
    }
}

常用过滤插件(Filter plugin)

丰富的过滤器插件的是 logstash威力如此强大的重要因素,过滤器插件主要处理流经当前Logstash的事件信息,可以添加字段、移除字段、转换字段类型,通过正则表达式切分数据等,也可以根据条件判断来进行不同的数据处理方式。

常用插件有:grok、date、mutate、JSON、es、Split、GeoIP、Ruby。

grok正则捕获

grok 是Logstash中将非结构化数据解析成结构化数据以便于查询的最好工具,非常适合解析syslog logs,apache log, mysql log,以及一些其他的web log。

(1)预定义表达式调用

Logstash提供120个常用正则表达式可供安装使用,安装之后你可以通过名称调用它们,语法如下:%{SYNTAX:SEMANTIC}

  • SYNTAX:表示已经安装的正则表达式的名称
  • SEMANTIC:表示从Event中匹配到的内容的名称

例如:Event的内容为“[debug] 127.0.0.1 - test log content”,匹配%{IP:client}将获得“client: 127.0.0.1”的结果,前提安装了IP表达式;如果你在捕获数据时想进行数据类型转换可以使用%{NUMBER:num:int}这种语法,默认情况下,所有的返回结果都是string类型,当前Logstash所支持的转换类型仅有“int”和“float”;

一个稍微完整一点的事例:

  • 日志文件http.log内容:55.3.244.1 GET /index.html 15824 0.043

  • 表达式:%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}

配置文件内容:

input {
    
    
  file {
    
    
    path => "/var/log/http.log"
  }
}
filter {
    
    
  grok {
    
    
    match => {
    
    "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"}
  }
}

输出结果:

client: 55.3.244.1
method: GET
request: /index.html
bytes: 15824
duration: 0.043

(2)自定义表达式调用

  • 语法:(?<field_name>the pattern here)
  • 举例:捕获10或11和长度的十六进制queue_id可以使用表达式(?<queue_id>[0-9A-F]{10,11})

安装自定义表达式。与预定义表达式相同,你也可以将自定义的表达式配置到Logstash中,然后就可以像于定义的表达式一样使用;以下是操作步骤说明:

  • 在Logstash根目录下创建文件夹“patterns”,在“patterns”文件夹中创建文件“extra”(文件名称无所谓,可自己选择有意义的文件名称);

  • 在文件“extra”中添加表达式,格式:patternName regexp,名称与表达式之间用空格隔开即可,如下:

    # contents of ./patterns/postfix:
    POSTFIX_QUEUEID [0-9A-F]{
          
          10,11}
    
  • 使用自定义的表达式时需要指定“patterns_dir”变量,变量内容指向表达式文件所在的目录,举例如下:

    ## 日志内容 ##
    Jan  1 06:25:43 mailserver14 postfix/cleanup[21403]: BEF25A72965: message-id=<20130101142543[email protected]>
    
    ## Logstash配置 ##
    filter {
          
          
      grok {
          
          
        patterns_dir => ["./patterns"]
        match => {
          
           "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" }
      }
    }
    
    ## 运行结果 ##
    timestamp: Jan 1 06:25:43
    logsource: mailserver14
    program: postfix/cleanup
    pid: 21403
    queue_id: BEF25A72965
    

grok常用配置参数(空 => 同上)

其他:

  • 一般的正则表达式只能匹配单行文本,如果一个Event的内容为多行,可以在pattern前加“(?m)”
  • 对于Hash和Array类型,Hash表示键值对,Array表示数组
  • Grok表达式在线debug地址:http://grokdebug.herokuapp.com
  • 预定义正则表达式参考地址:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

date时间处理插件

该插件用于时间字段的格式转换,比如将“Apr 17 09:32:01”(MMM dd HH:mm:ss)转换为“MM-dd HH:mm:ss”。而且通常情况下,Logstash会为自动给Event打上时间戳,但是这个时间戳是Event的处理时间(主要是input接收数据的时间),和日志记录时间会存在偏差(主要原因是buffer),我们可以使用此插件用日志发生时间替换掉默认是时间戳的值。

input{
    
    
    stdin{
    
    
	}
}
filter{
    
    
    date{
    
    
    	timezone => "Asia/Chongqing"
        match => ["logtime", "yyyy/MM/dd HH:mm:ss SSS"]
        target => "@timestamp"
	}
}
output{
    
    
    stdout{
    
    codec => rubydebug}
}

使用date插件过滤,这里是一个简单的配置,使用matchmessage字段中的内容进行时间转化,默认将转化后的结果放到了@timestamp中.

常用配置参数(空 => 同上):

mutate数据修改插件

mutate 插件是 Logstash另一个重要插件。它提供了丰富的基础类型数据处理能力。可以重命名,删除,替换和修改事件中的字段。

logstash-filter-mutate 插件是Logstash 另一个重要插件,它提供了丰富的基础类型数据处理能力,包括类型转换,字符串处理和字段处理等

类型转换是logstash-filter-mutate 插件最初诞生时的唯一功能,可以设置的转换类型包括:“integer”,“float” 和 “string”。示例如下:

input {
    
    
    stdin {
    
    
	}
}

filter {
    
    
    grok {
    
    
    	match =>{
    
    
    	"message" =>"(?<request_time>\d+(?:\.\d+)?)"
		}
	}
    mutate {
    
    
        convert => ["request_time", "float"]  # 字符串转换为float型
        # convert => ["request_time", "integer"]
   }
}
output {
    
    
    stdout {
    
    
    	codec =>rubydebug
	}
}

按照目前的官方文档中所描述的,配置文件中的 mutate 按以下顺序执行:

  • coerce
  • rename
  • update
  • replace
  • convert
  • gsub
  • uppercase
  • capitalize
  • lowercase
  • strip
  • remove
  • split
  • join
  • merge
  • copy

但是你可以通过使用不同的 mutate 块来控制这个顺序,比如:

filter {
    
    
    mutate {
    
    
        split => ["hostname", "."]
        add_field => {
    
     "shortHostname" => "%{hostname[0]}" }
    }
 
    mutate {
    
    
        rename => ["shortHostname", "hostname" ]
    }
}

常用配置参数(空 => 同上):

JSON插件

JSON插件用于解码JSON格式的字符串,一般是一堆日志信息中,部分是JSON格式,部分不是的情况下。

## 事例配置,message是JSON格式的字符串:"{\"uid\":3081609001,\"type\":\"signal\"}" 
filter {
    
    
    json {
    
    
        source => "message"
        target => "jsoncontent"
    }
}
## 输出结果 ##
{
    
    
    "@version": "1",
    "@timestamp": "2014-11-18T08:11:33.000Z",
    "host": "web121.mweibo.tc.sinanode.com",
    "message": "{
    
    \"uid\":3081609001,\"type\":\"signal\"}",
    "jsoncontent": {
    
    
        "uid": 3081609001,
        "type": "signal"
    }
}
## 如果从事例配置中删除`target`,输出结果如下 ##
{
    
    
    "@version": "1",
    "@timestamp": "2014-11-18T08:11:33.000Z",
    "host": "web121.mweibo.tc.sinanode.com",
    "message": "{
    
    \"uid\":3081609001,\"type\":\"signal\"}",
    "uid": 3081609001,
    "type": "signal"
}

常用配置参数(空 => 同上):

elasticsearch查询过滤插件

用于查询Elasticsearch中的事件,可将查询结果应用于当前事件中。

###类型TCC
input{
    
    
  elasticsearch {
    
    
    hosts => "10.10.x.x:9200"
    index => "cqct_20200508_03"
    query => '{"query":{"bool":{"must":[{"range":{"optime":{"gt":"1591754706000","lt":"1591754706006"}}}],"must_not":[],"should":[]}},"from":0,"sort":[],"aggs":{}}'
    docinfo => true
    }
}
filter{
    
    
        if [@metadata][_type] != "TCC" {
    
    
        drop{
    
    }
  }
}
output{
    
    
        elasticsearch{
    
    
                hosts => "10.10.y.y:9200"
                index => "cqct_20200508_03"
                document_type => "TCC"
                document_id => "%{id}"
                codec => json_lines
        }
        stdout{
    
    
                codec => json_lines
        }

}

##RFID
input{
    
    
  elasticsearch {
    
    
    hosts => "10.10.x.x:9200"
    index => "cqct_20200508_*"
    query => '{"query":{"bool":{"must":[{"range":{"collectTime":{"gt":"1591754706000","lt":"1591754706006"}}}],"must_not":[],"should":[]}},"from":0,"sort":[],"aggs":{}}'
    docinfo => true
    }
}
filter{
    
    
         if [@metadata][_type] != "RFID" {
    
    
        drop{
    
    }
  }
}
output{
    
    
        elasticsearch{
    
    
                hosts => "10.10.y.y:9200"
                index => "cqct_20200508_03"
                document_type => "RFID"
                document_id => "%{id}"
                codec => json_lines
        }
        stdout{
    
    
                codec => json_lines
        }
}

常用配置参数(空 => 同上):

常用输出插件(Output plugin)

ElasticSearch输出插件

用于将事件信息写入到Elasticsearch中,官方推荐插件,ELK必备插件。

output {
    
    
    elasticsearch {
    
    
        hosts => ["127.0.0.1:9200"]
        index => "filebeat-%{type}-%{+yyyy.MM.dd}"
        template_overwrite => true
    }
}

常用配置参数(空 => 同上)

Redis输出插件

用于将Event写入Redis中进行缓存,通常情况下Logstash的Filter处理比较吃系统资源,复杂的Filter处理会非常耗时,如果Event产生速度比较快,可以使用Redis作为buffer使用。

output {
    
    
    redis {
    
    
        host => "127.0.0.1"
        port => 6379
        data_type => "list"
        key => "logstash-list"
    }
}

常用配置参数(空 => 同上)

File输出插件

用于将Event输出到文件内。

output {
    
    
    file {
    
    
        path => ...
        codec => line {
    
     format => "custom format: %{message}"}
    }
}

常用配置参数(空 => 同上)

TCP插件

通过 TCP 套接字写入事件。每个事件 json 由换行符分隔。可以接受来自客户端的连接或连接到服务器,具体取决于模式。

tcp {
    
    
    host => ...
    port => ...
}

常用配置参数(空 => 同上):

实例

读取Redis数据,根据“type”判断,分别处理,输出到ES:

input {
    
    
    redis {
    
    
        host => "127.0.0.1"
        port => 6379
        data_type => "list"
        key => "logstash-list"
    }
}

filter {
    
    
    if [type] == "application" {
    
    
        grok {
    
    
            match => ["message", "(?m)-(?<systemName>.+?):(?<logTime>(?>\d\d){1,2}-(?:0?[1-9]|1[0-2])-(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9]) (?:2[0123]|[01]?[0-9]):(?:[0-5][0-9]):(?:(?:[0-5][0-9]|60)(?:[:.,][0-9]+)?)) \[(?<level>(\b\w+\b)) *\] (?<thread>(\b\w+\b)) \((?<point>.*?)\) - (?<content>.*)"]
        }
        date {
    
    
            match => ["logTime", "yyyy-MM-dd HH:mm:ss,SSS"]
        }
        json {
    
    
            source => "message"
        }
        date {
    
    
            match => ["timestamp", "yyyy-MM-dd HH:mm:ss,SSS"]
        }
    }
    if [type] == "application_bizz" {
    
    
        json {
    
    
            source => "message"
        }
        date {
    
    
            match => ["timestamp", "yyyy-MM-dd HH:mm:ss,SSS"]
        }
    }
    mutate {
    
    
        remove_field => ["@version", "beat", "logTime"]
    }
}

output {
    
    
    stdout{
    
    
    }
    elasticsearch {
    
    
        hosts => ["127.0.0.1:9200"]
        index => "filebeat-%{type}-%{+yyyy.MM.dd}"
        document_type => "%{documentType}"
        template_overwrite => true
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44766883/article/details/131018831