Logstash入门介绍

  大家好,我是一名程序员,我叫迷途的攻城狮,英文名字:Lost Engineer。我是一个有理想、有目标的完美主义者,永远都不安于现状。俗话说:不想当裁缝的厨子不是一个好司机,所以我的理想是将来有一天能成为一个超越我自己的人!

  这是我的第一篇博客,简单整理了一下最近学习的内容,大部分内容来源于网络,如果有不对的地方希望大家多多包含。

一、Logstash简介

1、官网地址

  ​​https://www.elastic.co/products/logstash​

2、软件介绍

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

  Logstash常用于日志关系系统中做日志采集设备;

Logstash简单介绍和使用说明_数据

3、系统结构

Logstash简单介绍和使用说明_redis_02

  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
      其中inputs和outputs支持codecs(coder&decoder)在1.3.0 版之前,logstash 只支持纯文本形式输入,然后以过滤器处理它。但现在,我们可以在输入 期处理不同类型的数据,所以完整的数据流程应该是:input | decode | filter | encode | output;codec 的引入,使得 logstash 可以更好更方便的与其他有自定义数据格式的运维产品共存,比如:graphite、fluent、netflow、collectd,以及使用 msgpack、json、edn 等通用数据格式的其他产品等  

4、应用场景

  Logstash最常用于ELK(elasticsearch + logstash + kibane)中作为日志收集器使用

二、Logstash安装

1、环境清单

  • 操作系统:CentOS Linux release 7.3.1611
  • Logstash版本:logstash-5.4.1
  • Jdk版本:1.8.0_131

2、软件下载

  • 下载Jdk:
[chenlei@chenlei ~]$ wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz


  • 下载Logstash:
[chenlei@chenlei ~]$ wget https://artifacts.elastic.co/downloads/logstash/logstash-5.4.1.tar.gz


3、安装步骤

3.1、安装Jdk

  • 创建安装目录
[chenlei@chenlei ~]$ sudo mkdir /usr/local/Java


  • 解压缩安装文件
## 移动安装包到安装目录 ##
[chenlei@chenlei ~]$ sudo mv jdk-8u131-linux-x64.tar.gz /usr/local/Java/
## 进入安装目录 ##
[chenlei@chenlei ~]$ cd /usr/local/Java/
## 解压缩安装包 ##
[chenlei@chenlei Java]$ sudo tar -zxvf jdk-8u131-linux-x64.tar.gz
## 删除安装包 ##
[chenlei@chenlei Java]$ sudo rm jdk-8u131-linux-x64.tar.gz


  • 测试安装是否成功
## 进入JAVA_HOME ##
[chenlei@chenlei Java]$ cd jdk1.8.0_131/
## 测试java命令是否可以正常执行 ##
[chenlei@chenlei jdk1.8.0_131]$ ./bin/java -version


  • 配置JAVA_HOME环境变量
[chenlei@chenlei ~]$ cd ~
[chenlei@chenlei ~]$ vi .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

## 配置JAVA_HOME环境变量 ##
JAVA_HOME=/usr/local/Java/jdk1.8.0_131

## 将java执行目录加入到PATH下面 ##
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$JAVA_HOME/bin

export PATH
~
## 使环境变量生效 ##
[chenlei@chenlei ~]$ source .bash_profile
## 测试JAVA_HOME是否正确配置 ##
[chenlei@chenlei ~]$ java -version


3.2、安装Logstash

  • 创建安装目录
[chenlei@chenlei ~]$ sudo mkdir /usr/local/logstash


  • 解压缩安装文件
[chenlei@chenlei ~]$ sudo mv logstash-5.4.1.tar.gz /usr/local/logstash/
[chenlei@chenlei ~]$ cd /usr/local/logstash/
[chenlei@chenlei logstash]$ sudo tar -zxvf logstash-5.4.1.tar.gz


  • 测试安装是否成功
  • 测试一、快速启动,标准输入输出作为input和output,没有filter
  • [chenlei@chenlei logstash]$ cd logstash-5.4.1/[chenlei@chenlei 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 [2017-06-17T13:37:13,449][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/usr/local/logstash/logstash-5.4.1/data/queue"} [2017-06-17T13: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"} [2017-06-17T13: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} [2017-06-17T13:37:13,612][INFO ][logstash.pipeline ] Pipeline main started The stdin plugin is now waiting for input: [2017-06-17T13:37:13,650][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600} ## 此时命令窗口停留在等待输入状态,键盘键入任意字符 ## hello world ## 下方是Logstash输出到效果 ## 2017-06-17T05:37:29.401Z chenlei.master hello world
  • 测试二、在测试一堆基础上加上codec进行格式化输出
    • [chenlei@chenlei logstash-5.4.1]$ ./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 [2017-06-17T14: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} [2017-06-17T14:01:50,356][INFO ][logstash.pipeline ] Pipeline main started The stdin plugin is now waiting for input: [2017-06-17T14:01:50,406][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600} ## 此时命令窗口停留在等待输入状态,键盘键入任意字符 ## hello world ## 下方是Logstash输出到效果 ## { "@timestamp" => 2017-06-17T06:02:19.189Z, "@version" => "1", "host" => "chenlei.master", "message" => "hello world" }

    三、Logstash参数与配置

    1、常用启动参数

    参数

    说明

    举例

    -e

    立即执行,使用命令行里的配置参数启动实例

    ./bin/logstash -e ‘input {stdin {}} output {stdout {}}’

    -f

    指定启动实例的配置文件

    ./bin/logstash -f config/test.conf

    -t

    测试配置文件的正确性

    ./bin/logstash-f config/test.conf -t

    -l

    指定日志文件名称

    ./bin/logstash-f config/test.conf -l logs/test.log

    -w

    指定filter线程数量,默认线程数是5

    ./bin/logstash-f config/test.conf -w 8

    2、配置文件结构及语法

    • 区段
        Logstash通过{}来定义区域,区域内可以定义插件,一个区域内可以定义多个插件,如下:
    input {
    stdin {
    }
    beats {
    port => 5044
    }
    }


    • 数据类型
        Logstash仅支持少量的数据类型:

    ​ Boolean:ssl_enable => true

    ​ Number:port => 33

    ​ String:name => “Hello world”

    ​ Commonts:# this is a comment

    • 字段引用
        Logstash数据流中的数据被称之为Event对象,Event以JSON结构构成,Event的属性被称之为字段,如果你像在配置文件中引用这些字段,只需要把字段的名字写在中括号[]里就行了,如[type],对于嵌套字段每层字段名称都写在[]里就可以了,比如:[tags][type];除此之外,对于Logstash的arrag类型支持下标与倒序下表,如:[tags][type][0],[tags][type][-1]
    • 条件判断
        Logstash支持下面的操作符:

    ​ equality:==, !=, <, >, <=, >=

    ​ regexp:=~, !~

    ​ inclusion:in, not in

    ​ boolean:and, or, nand, xor

    ​ unary:!

      例如:

    if EXPRESSION {
    ...
    } else if EXPRESSION {
    ...
    } else {
    ...
    }


    • 环境变量引用
        Logstash支持引用系统环境变量,环境变量不存在时可以设置默认值,例如:
    export TCP_PORT=12345
    input {
    tcp {
    port => "${TCP_PORT:54321}"
    }
    }


    3、常用输入插件(Input plugin)

    3.1、File读取插件

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

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


    • 常用参数

    参数名称

    类型

    默认值

    描述信息

    add_field

    hash

    {}

    用于向Event中添加字段

    close_older

    number

    3600

    设置文件多久秒内没有更新就关掉对文件的监听

    codec

    string

    “plain”

    输入数据之后对数据进行解码

    delimiter

    string

    “\n”

    文件内容的行分隔符,默认按照行进行Event封装

    discover_interval

    number

    15

    间隔多少秒查看一下path匹配对路径下是否有新文件产生

    enable_metric

    boolean

    true

     

    exclude

    array

    path匹配的文件中指定例外,如:path => “/var/log/“;exclude =>”.gz”

    id

    string

    区分两个相同类型的插件,比如两个filter,在使用Monitor API监控是可以区分,建议设置上ID

    ignore_older

    number

    忽略历史修改,如果设置3600秒,logstash只会发现一小时内被修改过的文件,一小时之前修改的文件的变化不会被读取,如果再次修改该文件,所有的变化都会被读取,默认被禁用

    max_open_files

    number

    logstash可以同时监控的文件个数(同时打开的file_handles个数),如果你需要处理多于这个数量多文件,可以使用“close_older”去关闭一些文件

    path

    array

    必须设置项,用于匹配被监控的文件,如“/var/log/.log”或者“/var/log/*/*.log”,必须使用绝对路径

    sincedb_path

    string

    文件读取记录,必须指定一个文件而不是目录,文件中保存没个被监控的文件等当前inode和byteoffset,默认存放位置“$HOME/.sincedb*”

    sincedb_write_interval

    number

    15

    间隔多少秒写一次sincedb文件

    start_position

    “beginning”,“end”

    ” end”

    从文件等开头还是结尾读取文件内容,默认是结尾,如果需要导入文件中的老数据,可以设置为“beginning”,该选项只在第一次启动logstash时有效,如果文件已经存在于sincedb的记录内,则此配置无效

    stat_interval

    number

    1

    间隔多少秒检查一下文件是否被修改,加大此参数将降低系统负载,但是增加了发现新日志的间隔时间

    tags

    array

    可以在Event中增加标签,以便于在后续的处理流程中使用

    type

    string

     

    Event的type字段,如果采用elasticsearch做store,在默认情况下将作为elasticsearch的type

    3.2、Beats监听插件

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

    • 配置事例
    input {
    beats {
    port => 5044
    }
    }


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

    参数名称

    类型

    默认值

    描述信息

    cipher_suites

    array

     

    密码加密算法列表,根据优先级排序

    client_inactivity_timeout

    number

    60

    多长时间之后关闭空闲的连接

    codec

     

     

     

    enable_metric

     

     

     

    host

    string

    “0.0.0.0”

    监听的IP地址

    id

     

     

     

    include_codec_tag

    boolean

    true

     

    port

    number

    必须设置项,监听服务监听的端口

    ssl

    boolean

    false

    是否启用ssl

    ssl_certificate

    string

    ssl证书路径

    ssl_certificate_authorities

    array

    []

    定义证书文件或者路径列表,当“ssl_verify_mode”被设置为“peer”或者“force_peer”时有效

    ssl_handshake_timeout

    number

    10000

    间隔多少毫秒ssl握手超时

    ssl_key

    string

    ssl密钥

    ssl_key_passphrase

    string

    ssl密钥密码

    ssl_verify_mode

    “none”、”peer”、”force_peer”

    none

     

    tags

     

     

     

    tls_max_version

    number

    1.2

    Themaximum TLS version allowed for the encrypted connections. The value must bethe one of the following: 1.0 for TLS 1.0, 1.1 for TLS 1.1, 1.2 for TLS 1.2

    tls_min_version

    number

    1

    Theminimum TLS version allowed for the encrypted connections. The value must beone of the following: 1.0 for TLS 1.0, 1.1 for TLS 1.1, 1.2 for TLS 1.2

    3.3、TCP监听插件

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

    • 配置事例
    tcp {
    port => 41414
    }


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

    参数名称

    类型

    默认值

    描述信息

    add_field

     

     

     

    codec

     

     

     

    enable_metric

     

     

     

    host

     

     

     

    id

     

     

     

    mode

    “server”、“client”

    “server”

    “server”监听“client”的连接请求,“client”连接“server”

    port

    number

    必须设置项,“server”模式时指定监听端口,“client”模式指定连接端口

    proxy_protocol

    boolean

    false

    Proxyprotocol support, only v1 is supported at this time

    ssl_cert

     

     

     

    ssl_enable

     

     

     

    ssl_extra_chain_certs

     

     

     

    ssl_key

     

     

     

    ssl_key_passphrase

     

     

     

    ssl_verify

     

     

     

    tags

     

     

     

    type

     

     

     

    3.4、Redis读取插件

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

    • 配置事例
    input {
    redis {
    host => "127.0.0.1"
    port => 6379
    data_type => "list"
    key => "logstash-list"
    }
    }


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

    参数名称

    类型

    默认值

    描述信息

    add_field

     

     

     

    batch_count

    number

    125

    使用redis的batch特性,需要redis2.6.0或者更新的版本

    codec

     

     

     

    data_type

    list,channel, pattern_channel

    必须设置项,根据设置不同,订阅redis使用不同的命令,依次是:BLPOP、SUBSCRIBE、PSUBSCRIBE,需要注意的是“channel”和“pattern_channel”是广播类型,相同的数据会同时发送给订阅了该channel的logstash,也就是说在logstash集群环境下会出现数据重复,集群中的每一个节点都将收到同样的数据,但是在单节点情况下,“pattern_channel”可以同时定于满足pattern的多个key

    db

    number

    0

    指定使用的redis数据库

    enable_metric

     

     

     

    host

    string

    127.0.0.1

    redis服务地址

    id

     

     

     

    key

    string

    必须设置项,reidslist或者channel的key名称

    password

    string

    redis密码

    port

    number

    6379

    redis连接端口号

    tags

     

     

     

    threads

    number

    1

     

    timeout

    number

    5

    redis服务连接超时时间,单位:秒

    3.5、Syslog监听插件

      监听操作系统syslog信息

    • 配置事例
    syslog {
    }


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

    参数名称

    类型

    默认值

    描述信息

    add_field

     

     

     

    codec

     

     

     

    enable_metric

     

     

     

    facility_labels

    array

    [“kernel”,”user-level”, “mail”, “system”,”security/authorization”, “syslogd”, “lineprinter”, “network news”, “UUCP”, “clock”,”security/authorization”, “FTP”, “NTP”, “logaudit”, “log alert”, “clock”, “local0”,”local1”, “local2”, “local3”, “local4”,”local5”, “local6”, “local7”]

    Labelsfor facility levels. These are defined in RFC3164.

    host

    string

    “0.0.0.0”

    监听地址

    id

     

     

     

    locale

    string

    区域设置,类似linux的locale,日期格式设置

    port

    number

    514

    监听端口,Remember that ports less than 1024(privileged ports) may require root to use.

    proxy_protocol

     

     

     

    severity_labels

    array

    [“Emergency”,”Alert”, “Critical”, “Error”,”Warning”, “Notice”, “Informational”,”Debug”]

    Labelsfor severity levels. These are defined in RFC3164.

    tags

     

     

     

    timezone

    string

    指定时区以便格式化日期

    type

    string

    This is the base class for Logstash inputs. Add a ​​type​​ field to all events handled by this input.

    use_labels

    boolean

    true

    Uselabel parsing for severity and facility levels.

    4、常用过滤插件(Filter plugin)

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

    4.1、grok正则捕获

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

    • 预定义表达式调用
        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


    • 自定义表达式调用
    • 语法:​​(?<field_name>the pattern here)​
    • 举例:捕获10或11和长度的十六进制queue_id可以使用表达式​​(?<queue_id>[0-9A-F]{10,11})​
    • 安装自定义表达式
        与预定义表达式相同,你也可以将自定义的表达式配置到Logstash中,然后就可以像于定义的表达式一样使用;以下是操作步骤说明:
        1、在Logstash根目录下创建文件夹“patterns”,在“patterns”文件夹中创建文件“extra”(文件名称无所谓,可自己选择有意义的文件名称);
        2、在文件“extra”中添加表达式,格式:patternName regexp,名称与表达式之间用空格隔开即可,如下:
    # contents of ./patterns/postfix:
    POSTFIX_QUEUEID [0-9A-F]{10,11}


      3、使用自定义的表达式时需要指定“patterns_dir”变量,变量内容指向表达式文件所在的目录,举例如下:

    ## 日志内容 ##
    Jan 1 06:25:43 mailserver14 postfix/cleanup[21403]: BEF25A72965: message-id=<20130101142543.5828399CCAF@mailserver14.example.com>
    ## 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常用配置参数(空 => 同上)

    参数名称

    类型

    默认值

    描述信息

    add_field

     

     

     

    add_tag

     

     

     

    break_on_match

    boolean

    true

    match字段存在多个pattern时,当第一个匹配成功后结束后面的匹配,如果想匹配所有的pattern,将此参数设置为false

    enable_metric

     

     

     

    id

     

     

     

    keep_empty_captures

    boolean

    false

    如果为true,捕获失败的字段奖设置为空值

    match

    array

    {}

    设置pattern数组: match=> {“message” => [“Duration: %{NUMBER:duration}”,”Speed: %{NUMBER:speed}”]}

    named_captures_only

    boolean

    true

    If true, only store named captures from grok.

    overwrite

    array

    []

    覆盖字段内容: match=> { “message” => “%{SYSLOGBASE} %{DATA:message}” }

    overwrite=> [ “message” ]

    patterns_dir

    array

    []

    指定自定义的pattern文件存放目录,Logstash在启动时会读取文件夹内patterns_files_glob 匹配的所有文件内容

    patterns_files_glob

    string

    “*”

    用于匹配patterns_dir中的文件

    periodic_flush

    boolean

    false

    定期调用filter的flush方法

    remove_field

    array

    []

    从Event中删除任意字段: remove_field=> [ “foo_%{somefield}” ]

    remove_tag

    array

    []

    删除“tags”中的值: remove_tag=> [ “foo_%{somefield}” ]

    tag_on_failure

    array

    [“_grokparsefailure”]

    当没有匹配成功时,将此array添加到“tags”字段内

    tag_on_timeout

    string

    “_groktimeout”

    当匹配超时时,将此内容添加到“tags”字段内

    timeout_millis

    number

    30000

    设置单个match到超时时间,单位:毫秒,如果设置为0,则不启用超时设置

    - 其他

    - 一般的正则表达式只能匹配单行文本,如果一个Event的内容为多行,可以在pattern前加“(?m)”

    - 对于Hash和Array类型,Hash表示键值对,Array表示数组

    - Grok表达式在线debug地址:​​http://grokdebug.herokuapp.com​

    - 预定义正则表达式参考地址:​​https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns​

    4.2、date时间处理插件

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

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

    参数名称

    类型

    默认值

    描述信息

    add_field

     

     

     

    add_tag

     

     

     

    enable_metric

     

     

     

    id

     

     

     

    locale

     

     

     

    match

    array

    []

    时间字段匹配,可自定多种格式,直到匹配到或者匹配结束,格式:[ field,formats… ],如:match=> [ “logdate”, “MMM dd yyyy HH:mm:ss”, “MMM d yyyy HH:mm:ss”, “ISO8601” ]

    periodic_flush

     

     

     

    remove_field

     

     

     

    remove_tag

     

     

     

    tag_on_failure

     

     

     

    target

    string

    “@timestamp”

    指定match匹配并且转换为date类型的存储位置(字段),默认覆盖到“@timestamp”

    timezone

    string

    指定时间格式化的时区

    4.3、mutate数据修改插件

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

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

    参数名称

    类型

    默认值

    描述信息

    add_field

     

     

     

    add_tag

     

     

     

    convert

    hash

    将指定字段转换为指定类型,字段内容是数组,则转换所有数组元素,如果字段内容是hash,则不做任何处理,目前支持的转换类型包括:integer,float, string, and boolean.例如: convert=> { “fieldname” => “integer” }

    enable_metric

     

     

     

    gsub

    array

    类似replace方法,使用指定内容替换掉目标字符串的现有内容,前提是目标字段必须是字符串,否则不做任何处理,例如:[ “fieldname”, “/”, ““, “fieldname2”, “[\\?#-]”, “.”],解释:使用“”替换掉“fieldname”中的所有“/”,使用“.”替换掉“fieldname2”中的所有“\”“?”、“#”和“-”

    id

     

     

     

    join

    hash

    使用指定的符号将array字段的每个元素连接起来,对非array字段无效。例如: 使用“,”将array字段“fieldname”的每一个元素连接成一个字符串: join=> { “fieldname” => “,” }

    lowercase

    array

    将自定的字段值转换为小写

    merge

    hash

    合并两个array或者hash,如果是字符串,将自动转换为一个单元素数组;将一个array和一个hash合并。例如: 将”added_field”合并到”dest_field”: merge=> { “dest_field” => “added_field” }

    periodic_flush

     

     

     

    remove_field

     

     

     

    remove_tag

     

     

     

    rename

    hash

    修改一个或者多个字段的名称。例如: 将”HOSTORIP”改名为”client_ip”: rename=> { “HOSTORIP” => “client_ip” }

    replace

    hash

    使用新值完整的替换掉指定字段的原内容,支持变量引用。例如: 使用字段“source_host”的内容拼接上字符串“: My new message”之后的结果替换“message”的值: replace=> { “message” => “%{source_host}: My new message” }

    split

    hash

    按照自定的分隔符将字符串字段拆分成array字段,只能作用于string类型的字段。例如: 将“fieldname”的内容按照“,”拆分成数组: split=> { “fieldname” => “,” }

    strip

    array

    去掉字段内容两头的空白字符。例如: 去掉“field1”和“field2”两头的空格: strip=> [“field1”, “field2”]

    update

    hash

    更新现有字段的内容,例如: 将“sample”字段的内容更新为“Mynew message”: update=> { “sample” => “My new message” }

    uppercase

    array

    将字符串转换为大写

    4.4、JSON插件

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

    • 配置事例
    json {
    source => ...
    }
    ## 事例配置,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"
    }


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

    参数名称

    类型

    默认值

    描述信息

    add_field

     

     

     

    add_tag

     

     

     

    enable_metric

     

     

     

    id

     

     

     

    periodic_flush

     

     

     

    remove_field

     

     

     

    remove_tag

     

     

     

    skip_on_invalid_json

    boolean

    false

    是否跳过验证不通过的JSON

    source

    string

    必须设置项,指定需要解码的JSON字符串字段

    tag_on_failure

     

     

     

    target

    string

    解析之后的JSON对象所在的字段名称,如果没有,JSON对象的所有字段将挂在根节点下

    4.5、elasticsearch查询过滤插件

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

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

    参数名称

    类型

    默认值

    描述信息

    add_field

     

     

     

    add_tag

     

     

     

    ca_file

    string

    SSL Certificate Authority file path

    enable_sort

    boolean

    true

    是否对结果进行排序

    fields

    array

    {}

    从老事件中复制字段到新事件中,老事件来源于elasticsearch(用于查询更新)

    hosts

    array

    [“localhost:9200”]

    elasticsearch服务列表

    index

    string

    “”

    用逗号分隔的elasticsearch索引列表,如果要操作所有所有使用“_all”或者“”,保存数据到elasticsearch时,如果索引不存在会自动以此创建

    password

    string

    密码

    periodic_flush

     

     

     

    query

    string

    查询elasticsearch的查询字符串

    remove_field

     

     

     

    remove_tag

     

     

     

    result_size

    number

    1

    查询elasticsearch时,返回结果的数量

    sort

    string

    “@timestamp:desc”

    逗号分隔的“:”列表,用于查询结果排序

    ssl

    boolean

    false

    SSL

    tag_on_failure

     

     

     

    user

    string

    用户名

    4.6、其他

      还有很多其他有用插件,如:Split、GeoIP、Ruby,这里就不一一写了,等以后用到再补充

    5、常用输出插件(Output plugin)

    5.1、ElasticSearch输出插件

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

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


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

    参数名称

    类型

    默认值

    描述信息

    absolute_healthcheck_path

    boolean

    false

    当配置了“healthcheck_path”时,决定elasticsearch健康检查URL是否按照绝对路径配置。例如: elasticsearch访问路径为:”http://localhost:9200/es“,“healthcheck_path”为”/health”, 当前参数为true时的访问路径为:”http://localhost:9200/es/health“, 当前参数为false时的访问路径为:”http://localhost:9200/health”

    absolute_sniffing_path

    boolean

    false

    当配置了“sniffing_path”时,决定elasticsearch的sniffing访问路径配置。例如: elasticsearch访问路径为:“http://localhost:9200/es”,“sniffing_path”为“/_sniffing”, 当前参数为true时的访问路径为:“http://localhost:9200/es/_sniffing”, 当前参数为false时的访问路径为:“http://localhost:9200/_sniffing”

    action

    string

    “index”

    对elasticsearch的操作类型,可用的操作类型: index:索引Logstash事件数据到elasticsearch; delete:根据id删除文档,id必须指定; delete:根据id删除文档,id必须指定; update:根据id更新文档

    cacert

    string

    .cer或者.pem证书文件路径,使用证书进行elasticsearch认证

    codec

     

     

     

    doc_as_upsert

    boolean

    false

    使update启用upsert模式,即文档不存在时创建新文档

    document_id

    string

    elasticsearch中的文档id,用来覆盖已经保存到elasticsearch中的文档

    document_type

    string

    指定存入elasticsearch中的文档的type,没有指定的情况下会使用Event信息中的“type”字段的值作为elasticsearch的type

    enable_metric

     

     

     

    failure_type_logging_whitelist

    array

    []

    elasricsearch报错白名单,白名单的异常信息不会被记入logstash的log中,比如你想忽略掉所有的“document_already_exists_exception”异常

    flush_size

     

     

     

    healthcheck_path

    string

    “/”

    elasricsearch检查状态检查路径

    hosts

    string

    [//127.0.0.1]

    elasticsearch服务地址列表,如果配置多个将启用负载均衡

    id

     

     

     

    idle_flush_time

    number

    1

    间隔多长时间将数据输出到elasticsearch中一次,主要用于较慢的事件

    index

    string

    “logstash-%{+YYYY.MM.dd}”

    指定elasticsearch存储数据时的所有名称,支持变量引用,比如你可以按天创建索引,方便删除历史数据或者查询制定范围内的数据

    keystore

    string

    用于指定密钥库路径,可以是.jks或者.p12

    keystore_password

    string

    密钥库密码

    manage_template

    boolean

    true

    是否启用elasticsearch模版,Logstash自带一个模版,但是只有名称匹配“logstash-*”的索引才会应用该默版

    parameters

    hash

    添加到elasticsearch URL后面的参数键值对

    parent

    string

    “nil”

    为文档子节点指定父节点的id

    password

    string

    elasticsearch集群访问密码

    path

    string

    当设置了elasticsearch代理时用此参数从定向HTTP API,如果“hosts”中已经包含此路径,则不需要设置

    pipeline

    string

    “nil”

    设置Event管道

    pool_max

    number

    1000

    elasticsearch最大连接数

    pool_max_per_route

    number

    100

    每个“endpoint”的最大连接数

    proxy

    string

    代理URL

    resurrect_delay

    number

    5

    检查挂掉的“endpoint”是否恢复正常的频率

    retry_initial_interval

    number

    2

    设置批量重试的时间间隔,重试到 “retry_max_interval”次

    retry_max_interval

    number

    64

    Setmax interval in seconds between bulk retries.

    retry_on_conflict

    number

    1

    Thenumber of times Elasticsearch should internally retry an update/upserteddocument

    routing

    string

    指定Event路由

    script

    string

    “”

    设置“scriptedupdate”模式下的脚本名称

    script_lang

    string

    “painless”

    设置脚本语言

    script_type

    “inline”、“indexed”、 “file”

    [“inline”]

    Definethe type of script referenced by “script” variable inline :”script” contains inline script indexed : “script” containsthe name of script directly indexed in elasticsearch file : “script”contains the name of script stored in elasticseach’s config directory

    script_var_name

    string

    “event”

    Setvariable name passed to script (scripted update)

    scripted_upsert

    boolean

    false

    ifenabled, script is in charge of creating non-existent document (scriptedupdate)

    sniffing

     

     

     

    sniffing_delay

     

     

     

    sniffing_path

     

     

     

    ssl

     

     

     

    ssl_certificate_verification

     

     

     

    template

    string

    设置自定义的默版存放路径

    template_name

    string

    “logstash”

    设置使用的默版名称

    template_overwrite

    boolean

    false

    是否始终覆盖现有模版

    timeout

    number

    60

    网络超时时间

    truststore

    string

    “:truststore”或者“:cacert”证书库路径

    truststore_password

    string

    证书库密码

    upsert

    string

    “”

    Setupsert content for update mode.s Create a new document with this parameter asjson string if document_id doesn’texists

    user

    string

    “”

    elasticsearch用户名

    validate_after_inactivity

    number

    10000

    间隔多长时间保持连接可用

    version

    string

    存入elasticsearch的文档的版本号

    version_type

    “internal”、“external”、 “external_gt”、 “external_gte”、“force”

     

    workers

    string

    1

    whenwe no longer support the :legacy type This is hacky, but it can only be herne

    5.2、Redis输出插件

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

    • 配置事例
    output {
    redis {
    host => "127.0.0.1"
    port => 6379
    data_type => "list"
    key => "logstash-list"
    }
    }


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

    参数名称

    类型

    默认值

    描述信息

    batch

    boolean

    false

    是否启用redis的batch模式,仅在data_type=”list”时有效

    batch_events

    number

    50

    batch大小,batch达到此大小时执行“RPUSH”

    batch_timeout

    number

    5

    batch超时时间,超过这个时间执行“RPUSH”

    codec

     

     

     

    congestion_interval

    number

    1

    间隔多长时间检查阻塞,如果设置为0,则没个Event检查一次

    congestion_threshold

    number

    0

     

    data_type

    “list”、“channel”

    存储在redis中的数据类型,如果使用“list”,将采用“RPUSH”操作,如果是“channel”,将采用“PUBLISH”操作

    db

    number

    0

    使用的redis数据库编号

    enable_metric

     

     

     

    host

    array

    [“127.0.0.1”]

    redis服务列表,如果配置多个,将随机选择一个,如果当前的redis服务不可用,将选择下一个

    id

     

     

     

    key

    string

    Thename of a Redis list or channel. Dynamic names are valid here, forexample logstash-%{type}.

    password

    string

    redis服务密码

    port

    number

    6379

    redis服务监听端口

    reconnect_interval

    number

    1

    连接失败时的重连间隔

    shuffle_hosts

    boolean

    true

    Shufflethe host list during Logstash startup.

    timeout

    number

    5

    redis连接超时时间

    workers

    number

    1

    whenwe no longer support the :legacy type This is hacky, but it can only be herne

    5.3、File输出插件

      用于将Event输出到文件内

    • 配置事例
    output {
    file {
    path => ...
    codec => line { format => "custom format: %{message}"}
    }
    }


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

    参数名称

    类型

    默认值

    描述信息

    codec

     

     

     

    create_if_deleted

    boolean

    true

    如果目标文件被删除,则在写入事件时创建新文件

    dir_mode

    number

    -1

    设置目录的访问权限,如果为“-1”,使用操作系统默认的访问权限

    enable_metric

     

     

     

    file_mode

    number

    -1

    设置文件的访问权限,如果为“-1”,使用操作系统默认的访问权限

    filename_failure

    string

    “_filepath_failures”

    如果指定的文件路径无效,这会在目录内创建这个文件并记录数据

    flush_interval

    number

    2

    flush间隔

    gzip

    boolean

    false

    是否启用gzip压缩

    id

     

     

     

    path

    string

    必须设置项,文件输出路径,如:path =>”./test-%{+YYYY-MM-dd}.txt”

    workers

    string

    1

    whenwe no longer support the :legacy type This is hacky, but it can only be herne

    5.4、TCP插件

      Write events over a TCP socket.Each event json is separated by a newline.Can either accept connections from clients or connect to a server, depending on ​​mode​​.

    • 配置事例
    tcp {
    host => ...
    port => ...
    }


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

    参数名称

    类型

    默认值

    描述信息

    codec

     

     

     

    enable_metric

     

     

     

    host

    string

    必须设置项,When mode is server,the address to listen on. When mode is client,the address to connect to.

    id

     

     

     

    mode

    “server”、“client”

    “client”

    Modeto operate in. server listens forclient connections, client connectsto a server.

    port

    number

    必须设置项,When mode is server, the port tolisten on. When mode is client, the port to connect to.

    reconnect_interval

    number

    10

    连接失败时,进程重新连接的事件间隔

    ssl_cacert

     

     

     

    ssl_cert

     

     

     

    ssl_enable

     

     

     

    ssl_key

     

     

     

    ssl_key_passphrase

     

     

     

    ssl_verify

     

     

     

    workers

     

     

     

    6、常用编码插件(Codec plugin)

    6.1、JSON编码插件

      直接输入预定义好的 JSON 数据,这样就可以省略掉 filter/grok 配置

    • 配置事例
    json {
    }


    • 常用配置参数

    参数名称

    类型

    默认值

    描述信息

    charset

    string

    “UTF-8”

    字符集

    enable_metric

     

     

     

    id

     

     

     

    四、Logstash实例

    1、接收Filebeat事件,输出到Redis

    input {
    beats {
    port => 5044
    }
    }

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


    2、读取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
    }
    }


    五、Logstash注意事项

    1、问题记录

    • 启动logstash慢,输入./bin/logstash没有反应,多出现在新安装的操作系统上
    • 原因
        jruby启动的时候jdk回去从/dev/random中初始化随机数熵,新版本的jruby会用RPNG算法产生随后的随机数,但是旧版本的jruby会持续从/dev/random中获取数字。但是不幸的是,random发生器会跟不上生成速度,所以获取随机数的过程会被阻塞,直到随机数池拥有足够的熵然后恢复。这在某些系统上,尤其是虚拟化系统,熵数池可能会比较小从而会减慢jruby的启动速度。
        检查一下系统的熵数池 cat /proc/sys/kernel/random/entropy_avail,正常情况这个数字推荐大于1000,对比了一下独立主机的这个数值,大约在700-900之间晃悠。
    • 解决
        使用伪随机,编辑/usr/local/logstash/logstash-5.4.1/config/jvm.options,在最后增加一行:-Djava.security.egd=file:/dev/urandom
    • 参考
    • https://github.com/elastic/logstash/issues/5507
    • http://www.tuicool.com/articles/jEBBZbb