Logstash简单介绍

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常用于日志关系系统中做日志采集设备;
这里写图片描述

3、系统结构

这里写图片描述

  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_fieldhash{}用于向Event中添加字段
close_oldernumber3600设置文件多久秒内没有更新就关掉对文件的监听
codecstring“plain”输入数据之后对数据进行解码
delimiterstring“\n”文件内容的行分隔符,默认按照行进行Event封装
discover_intervalnumber15间隔多少秒查看一下path匹配对路径下是否有新文件产生
enable_metricbooleantrue
excludearraypath匹配的文件中指定例外,如:path => “/var/log/“;exclude =>”.gz”
idstring区分两个相同类型的插件,比如两个filter,在使用Monitor API监控是可以区分,建议设置上ID
ignore_oldernumber忽略历史修改,如果设置3600秒,logstash只会发现一小时内被修改过的文件,一小时之前修改的文件的变化不会被读取,如果再次修改该文件,所有的变化都会被读取,默认被禁用
max_open_filesnumberlogstash可以同时监控的文件个数(同时打开的file_handles个数),如果你需要处理多于这个数量多文件,可以使用“close_older”去关闭一些文件
patharray必须设置项,用于匹配被监控的文件,如“/var/log/.log”或者“/var/log/*/*.log”,必须使用绝对路径
sincedb_pathstring文件读取记录,必须指定一个文件而不是目录,文件中保存没个被监控的文件等当前inode和byteoffset,默认存放位置“$HOME/.sincedb*”
sincedb_write_intervalnumber15间隔多少秒写一次sincedb文件
start_position“beginning”,“end”” end”从文件等开头还是结尾读取文件内容,默认是结尾,如果需要导入文件中的老数据,可以设置为“beginning”,该选项只在第一次启动logstash时有效,如果文件已经存在于sincedb的记录内,则此配置无效
stat_intervalnumber1间隔多少秒检查一下文件是否被修改,加大此参数将降低系统负载,但是增加了发现新日志的间隔时间
tagsarray可以在Event中增加标签,以便于在后续的处理流程中使用
typestringEvent的type字段,如果采用elasticsearch做store,在默认情况下将作为elasticsearch的type

3.2、Beats监听插件

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

  • 配置事例
input {
    beats {
        port => 5044
    }
}
  • 常用参数(空 => 同上)
参数名称类型默认值描述信息
cipher_suitesarray密码加密算法列表,根据优先级排序
client_inactivity_timeoutnumber60多长时间之后关闭空闲的连接
codec
enable_metric
hoststring“0.0.0.0”监听的IP地址
id
include_codec_tagbooleantrue
portnumber必须设置项,监听服务监听的端口
sslbooleanfalse是否启用ssl
ssl_certificatestringssl证书路径
ssl_certificate_authoritiesarray[]定义证书文件或者路径列表,当“ssl_verify_mode”被设置为“peer”或者“force_peer”时有效
ssl_handshake_timeoutnumber10000间隔多少毫秒ssl握手超时
ssl_keystringssl密钥
ssl_key_passphrasestringssl密钥密码
ssl_verify_mode“none”、”peer”、”force_peer”none
tags
tls_max_versionnumber1.2Themaximum 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_versionnumber1Theminimum 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”
portnumber必须设置项,“server”模式时指定监听端口,“client”模式指定连接端口
proxy_protocolbooleanfalseProxyprotocol 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_countnumber125使用redis的batch特性,需要redis2.6.0或者更新的版本
codec
data_typelist,channel, pattern_channel必须设置项,根据设置不同,订阅redis使用不同的命令,依次是:BLPOP、SUBSCRIBE、PSUBSCRIBE,需要注意的是“channel”和“pattern_channel”是广播类型,相同的数据会同时发送给订阅了该channel的logstash,也就是说在logstash集群环境下会出现数据重复,集群中的每一个节点都将收到同样的数据,但是在单节点情况下,“pattern_channel”可以同时定于满足pattern的多个key
dbnumber0指定使用的redis数据库
enable_metric
hoststring127.0.0.1redis服务地址
id
keystring必须设置项,reidslist或者channel的key名称
passwordstringredis密码
portnumber6379redis连接端口号
tags
threadsnumber1
timeoutnumber5redis服务连接超时时间,单位:秒

3.5、Syslog监听插件

  监听操作系统syslog信息

  • 配置事例
syslog {
}
  • 常用参数(空 => 同上)
参数名称类型默认值描述信息
add_field
codec
enable_metric
facility_labelsarray[“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.
hoststring“0.0.0.0”监听地址
id
localestring区域设置,类似linux的locale,日期格式设置
portnumber514监听端口,Remember that ports less than 1024(privileged ports) may require root to use.
proxy_protocol
severity_labelsarray[“Emergency”,”Alert”, “Critical”, “Error”,”Warning”, “Notice”, “Informational”,”Debug”]Labelsfor severity levels. These are defined in RFC3164.
tags
timezonestring指定时区以便格式化日期
typestringThis is the base class for Logstash inputs. Add a type field to all events handled by this input.
use_labelsbooleantrueUselabel 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_matchbooleantruematch字段存在多个pattern时,当第一个匹配成功后结束后面的匹配,如果想匹配所有的pattern,将此参数设置为false
enable_metric
id
keep_empty_capturesbooleanfalse如果为true,捕获失败的字段奖设置为空值
matcharray{}设置pattern数组: match=> {“message” => [“Duration: %{NUMBER:duration}”,”Speed: %{NUMBER:speed}”]}
named_captures_onlybooleantrueIf true, only store named captures from grok.
overwritearray[]覆盖字段内容: match=> { “message” => “%{SYSLOGBASE} %{DATA:message}” }
overwrite=> [ “message” ]
patterns_dirarray[]指定自定义的pattern文件存放目录,Logstash在启动时会读取文件夹内patterns_files_glob 匹配的所有文件内容
patterns_files_globstring“*”用于匹配patterns_dir中的文件
periodic_flushbooleanfalse定期调用filter的flush方法
remove_fieldarray[]从Event中删除任意字段: remove_field=> [ “foo_%{somefield}” ]
remove_tagarray[]删除“tags”中的值: remove_tag=> [ “foo_%{somefield}” ]
tag_on_failurearray[“_grokparsefailure”]当没有匹配成功时,将此array添加到“tags”字段内
tag_on_timeoutstring“_groktimeout”当匹配超时时,将此内容添加到“tags”字段内
timeout_millisnumber30000设置单个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
matcharray[]时间字段匹配,可自定多种格式,直到匹配到或者匹配结束,格式:[ 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
targetstring“@timestamp”指定match匹配并且转换为date类型的存储位置(字段),默认覆盖到“@timestamp”
timezonestring指定时间格式化的时区

4.3、mutate数据修改插件

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

  • 常用配置参数(空 => 同上)
参数名称类型默认值描述信息
add_field
add_tag
converthash将指定字段转换为指定类型,字段内容是数组,则转换所有数组元素,如果字段内容是hash,则不做任何处理,目前支持的转换类型包括:integer,float, string, and boolean.例如: convert=> { “fieldname” => “integer” }
enable_metric
gsubarray类似replace方法,使用指定内容替换掉目标字符串的现有内容,前提是目标字段必须是字符串,否则不做任何处理,例如:[ “fieldname”, “/”, ““, “fieldname2”, “[\\?#-]”, “.”],解释:使用“”替换掉“fieldname”中的所有“/”,使用“.”替换掉“fieldname2”中的所有“\”“?”、“#”和“-”
id
joinhash使用指定的符号将array字段的每个元素连接起来,对非array字段无效。例如: 使用“,”将array字段“fieldname”的每一个元素连接成一个字符串: join=> { “fieldname” => “,” }
lowercasearray将自定的字段值转换为小写
mergehash合并两个array或者hash,如果是字符串,将自动转换为一个单元素数组;将一个array和一个hash合并。例如: 将”added_field”合并到”dest_field”: merge=> { “dest_field” => “added_field” }
periodic_flush
remove_field
remove_tag
renamehash修改一个或者多个字段的名称。例如: 将”HOSTORIP”改名为”client_ip”: rename=> { “HOSTORIP” => “client_ip” }
replacehash使用新值完整的替换掉指定字段的原内容,支持变量引用。例如: 使用字段“source_host”的内容拼接上字符串“: My new message”之后的结果替换“message”的值: replace=> { “message” => “%{source_host}: My new message” }
splithash按照自定的分隔符将字符串字段拆分成array字段,只能作用于string类型的字段。例如: 将“fieldname”的内容按照“,”拆分成数组: split=> { “fieldname” => “,” }
striparray去掉字段内容两头的空白字符。例如: 去掉“field1”和“field2”两头的空格: strip=> [“field1”, “field2”]
updatehash更新现有字段的内容,例如: 将“sample”字段的内容更新为“Mynew message”: update=> { “sample” => “My new message” }
uppercasearray将字符串转换为大写

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_jsonbooleanfalse是否跳过验证不通过的JSON
sourcestring必须设置项,指定需要解码的JSON字符串字段
tag_on_failure
targetstring解析之后的JSON对象所在的字段名称,如果没有,JSON对象的所有字段将挂在根节点下

4.5、elasticsearch查询过滤插件

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

  • 常用配置参数(空 => 同上)
参数名称类型默认值描述信息
add_field
add_tag
ca_filestringSSL Certificate Authority file path
enable_sortbooleantrue是否对结果进行排序
fieldsarray{}从老事件中复制字段到新事件中,老事件来源于elasticsearch(用于查询更新)
hostsarray[“localhost:9200”]elasticsearch服务列表
indexstring“”用逗号分隔的elasticsearch索引列表,如果要操作所有所有使用“_all”或者“”,保存数据到elasticsearch时,如果索引不存在会自动以此创建
passwordstring密码
periodic_flush
querystring查询elasticsearch的查询字符串
remove_field
remove_tag
result_sizenumber1查询elasticsearch时,返回结果的数量
sortstring“@timestamp:desc”逗号分隔的“:”列表,用于查询结果排序
sslbooleanfalseSSL
tag_on_failure
userstring用户名

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_pathbooleanfalse当配置了“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_pathbooleanfalse当配置了“sniffing_path”时,决定elasticsearch的sniffing访问路径配置。例如: elasticsearch访问路径为:“http://localhost:9200/es”,“sniffing_path”为“/_sniffing”, 当前参数为true时的访问路径为:“http://localhost:9200/es/_sniffing”, 当前参数为false时的访问路径为:“http://localhost:9200/_sniffing
actionstring“index”对elasticsearch的操作类型,可用的操作类型: index:索引Logstash事件数据到elasticsearch; delete:根据id删除文档,id必须指定; delete:根据id删除文档,id必须指定; update:根据id更新文档
cacertstring.cer或者.pem证书文件路径,使用证书进行elasticsearch认证
codec
doc_as_upsertbooleanfalse使update启用upsert模式,即文档不存在时创建新文档
document_idstringelasticsearch中的文档id,用来覆盖已经保存到elasticsearch中的文档
document_typestring指定存入elasticsearch中的文档的type,没有指定的情况下会使用Event信息中的“type”字段的值作为elasticsearch的type
enable_metric
failure_type_logging_whitelistarray[]elasricsearch报错白名单,白名单的异常信息不会被记入logstash的log中,比如你想忽略掉所有的“document_already_exists_exception”异常
flush_size
healthcheck_pathstring“/”elasricsearch检查状态检查路径
hostsstring[//127.0.0.1]elasticsearch服务地址列表,如果配置多个将启用负载均衡
id
idle_flush_timenumber1间隔多长时间将数据输出到elasticsearch中一次,主要用于较慢的事件
indexstring“logstash-%{+YYYY.MM.dd}”指定elasticsearch存储数据时的所有名称,支持变量引用,比如你可以按天创建索引,方便删除历史数据或者查询制定范围内的数据
keystorestring用于指定密钥库路径,可以是.jks或者.p12
keystore_passwordstring密钥库密码
manage_templatebooleantrue是否启用elasticsearch模版,Logstash自带一个模版,但是只有名称匹配“logstash-*”的索引才会应用该默版
parametershash添加到elasticsearch URL后面的参数键值对
parentstring“nil”为文档子节点指定父节点的id
passwordstringelasticsearch集群访问密码
pathstring当设置了elasticsearch代理时用此参数从定向HTTP API,如果“hosts”中已经包含此路径,则不需要设置
pipelinestring“nil”设置Event管道
pool_maxnumber1000elasticsearch最大连接数
pool_max_per_routenumber100每个“endpoint”的最大连接数
proxystring代理URL
resurrect_delaynumber5检查挂掉的“endpoint”是否恢复正常的频率
retry_initial_intervalnumber2设置批量重试的时间间隔,重试到 “retry_max_interval”次
retry_max_intervalnumber64Setmax interval in seconds between bulk retries.
retry_on_conflictnumber1Thenumber of times Elasticsearch should internally retry an update/upserteddocument
routingstring指定Event路由
scriptstring“”设置“scriptedupdate”模式下的脚本名称
script_langstring“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_namestring“event”Setvariable name passed to script (scripted update)
scripted_upsertbooleanfalseifenabled, script is in charge of creating non-existent document (scriptedupdate)
sniffing
sniffing_delay
sniffing_path
ssl
ssl_certificate_verification
templatestring设置自定义的默版存放路径
template_namestring“logstash”设置使用的默版名称
template_overwritebooleanfalse是否始终覆盖现有模版
timeoutnumber60网络超时时间
truststorestring“:truststore”或者“:cacert”证书库路径
truststore_passwordstring证书库密码
upsertstring“”Setupsert content for update mode.s Create a new document with this parameter asjson string if document_id doesn’texists
userstring“”elasticsearch用户名
validate_after_inactivitynumber10000间隔多长时间保持连接可用
versionstring存入elasticsearch的文档的版本号
version_type“internal”、“external”、 “external_gt”、 “external_gte”、“force”
workersstring1whenwe 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"
    }
}
  • 常用配置参数(空 => 同上)
参数名称类型默认值描述信息
batchbooleanfalse是否启用redis的batch模式,仅在data_type=”list”时有效
batch_eventsnumber50batch大小,batch达到此大小时执行“RPUSH”
batch_timeoutnumber5batch超时时间,超过这个时间执行“RPUSH”
codec
congestion_intervalnumber1间隔多长时间检查阻塞,如果设置为0,则没个Event检查一次
congestion_thresholdnumber0
data_type“list”、“channel”存储在redis中的数据类型,如果使用“list”,将采用“RPUSH”操作,如果是“channel”,将采用“PUBLISH”操作
dbnumber0使用的redis数据库编号
enable_metric
hostarray[“127.0.0.1”]redis服务列表,如果配置多个,将随机选择一个,如果当前的redis服务不可用,将选择下一个
id
keystringThename of a Redis list or channel. Dynamic names are valid here, forexample logstash-%{type}.
passwordstringredis服务密码
portnumber6379redis服务监听端口
reconnect_intervalnumber1连接失败时的重连间隔
shuffle_hostsbooleantrueShufflethe host list during Logstash startup.
timeoutnumber5redis连接超时时间
workersnumber1whenwe 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_deletedbooleantrue如果目标文件被删除,则在写入事件时创建新文件
dir_modenumber-1设置目录的访问权限,如果为“-1”,使用操作系统默认的访问权限
enable_metric
file_modenumber-1设置文件的访问权限,如果为“-1”,使用操作系统默认的访问权限
filename_failurestring“_filepath_failures”如果指定的文件路径无效,这会在目录内创建这个文件并记录数据
flush_intervalnumber2flush间隔
gzipbooleanfalse是否启用gzip压缩
id
pathstring必须设置项,文件输出路径,如:path =>”./test-%{+YYYY-MM-dd}.txt”
workersstring1whenwe 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
hoststring必须设置项,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.
portnumber必须设置项,When mode is server, the port tolisten on. When mode is client, the port to connect to.
reconnect_intervalnumber10连接失败时,进程重新连接的事件间隔
ssl_cacert
ssl_cert
ssl_enable
ssl_key
ssl_key_passphrase
ssl_verify
workers

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

6.1、JSON编码插件

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

  • 配置事例
json {
}
  • 常用配置参数
参数名称类型默认值描述信息
charsetstring“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

六、Logstash参考资料

已标记关键词 清除标记
ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。 Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。 Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。 Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。 该课程从ELK组件中的两大组件和常用的应用日志收集进行剖析讲解。 (1)ElasticSearch:从单台的安装到集群的搭建、从基础的入门使用到高级的搜索和聚合都进行了较好的阐述。 (2) Logstash:通过收集apache日志,使用grok插件和geoip插件先让学习人员对整体框架做到了了解于胸。然后再深入的对LogStash重要的知识点进行了剖析。 (3)应用日志收集:对常见的Apache、Nginx、MySQL、Syslog进行日志收集和分析。虽说没有讲解太多,但是我想应该能做到让大家对应用日志收集了解的更加深入。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页