ELK 之 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
  • 1
  • 下载Logstash:
[chenlei@chenlei ~]$ wget https://artifacts.elastic.co/downloads/logstash/logstash-5.4.1.tar.gz
  • 1

3、安装步骤

3.1、安装Jdk

  • 创建安装目录
[chenlei@chenlei ~]$ sudo mkdir /usr/local/Java
  • 1
  • 解压缩安装文件
## 移动安装包到安装目录 ##
[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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 测试安装是否成功
## 进入JAVA_HOME ##
[chenlei@chenlei Java]$ cd jdk1.8.0_131/
## 测试java命令是否可以正常执行 ##
[chenlei@chenlei jdk1.8.0_131]$ ./bin/java -version
  • 1
  • 2
  • 3
  • 4
  • 配置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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

3.2、安装Logstash

  • 创建安装目录
[chenlei@chenlei ~]$ sudo mkdir /usr/local/logstash
  • 1
  • 解压缩安装文件
[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
  • 1
  • 2
  • 3
  • 测试安装是否成功

    • 测试一、快速启动,标准输入输出作为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
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 测试二、在测试一堆基础上加上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"
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

三、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
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 数据类型

      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 {
  ...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 环境变量引用

      Logstash支持引用系统环境变量,环境变量不存在时可以设置默认值,例如:

export TCP_PORT=12345
  • 1
input {
  tcp {
    port => "${TCP_PORT:54321}"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5

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

3.1、File读取插件

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

  • 配置事例
input
  file {
    path => ["/var/log/*.log", "/var/log/message"]
    type => "system"
    start_position => "beginning"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 常用参数
参数名称 类型 默认值 描述信息
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
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 常用参数(空 => 同上)
参数名称 类型 默认值 描述信息
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
}
  • 1
  • 2
  • 3
  • 常用参数(空 => 同上)
参数名称 类型 默认值 描述信息
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"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 常用参数(空 => 同上)
参数名称 类型 默认值 描述信息
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 {
}
  • 1
  • 2
  • 常用参数(空 => 同上)
参数名称 类型 默认值 描述信息
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}"}
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

​ 输出结果:

client: 55.3.244.1
method: GET
request: /index.html
bytes: 15824
duration: 0.043
  • 1
  • 2
  • 3
  • 4
  • 5
  • 自定义表达式调用 
    • 语法:(?<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}
  • 1
  • 2

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

## 日志内容 ##
Jan  1 06:25:43 mailserver14 postfix/cleanup[21403]: BEF25A72965: message-id=<20130101142543.5828399CCAF@mailserver14.example.com>
  • 1
  • 2
## Logstash配置 ##
filter {
  grok {
    patterns_dir => ["./patterns"]
    match => { "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
## 运行结果 ##
timestamp: Jan 1 06:25:43
logsource: mailserver14
program: postfix/cleanup
pid: 21403
queue_id: BEF25A72965
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 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 => ...
}
  • 1
  • 2
  • 3
## 事例配置,message是JSON格式的字符串:"{\"uid\":3081609001,\"type\":\"signal\"}" ##
filter {
    json {
        source => "message"
        target => "jsoncontent"
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
## 输出结果 ##
{
    "@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"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 常用配置参数(空 => 同上)
参数名称 类型 默认值 描述信息
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
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 常用配置参数(空 => 同上)
参数名称 类型 默认值 描述信息
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"
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 常用配置参数(空 => 同上)
参数名称 类型 默认值 描述信息
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}"}
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 常用配置参数(空 => 同上)
参数名称 类型 默认值 描述信息
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 => ...
}
  • 1
  • 2
  • 3
  • 4
  • 常用配置参数(空 => 同上)
参数名称 类型 默认值 描述信息
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 {
}
  • 1
  • 2
  • 常用配置参数
参数名称 类型 默认值 描述信息
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"
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

五、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参考资料

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
  • 1
  • 下载Logstash:
[chenlei@chenlei ~]$ wget https://artifacts.elastic.co/downloads/logstash/logstash-5.4.1.tar.gz
  • 1

3、安装步骤

3.1、安装Jdk

  • 创建安装目录
[chenlei@chenlei ~]$ sudo mkdir /usr/local/Java
  • 1
  • 解压缩安装文件
## 移动安装包到安装目录 ##
[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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 测试安装是否成功
## 进入JAVA_HOME ##
[chenlei@chenlei Java]$ cd jdk1.8.0_131/
## 测试java命令是否可以正常执行 ##
[chenlei@chenlei jdk1.8.0_131]$ ./bin/java -version
  • 1
  • 2
  • 3
  • 4
  • 配置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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

3.2、安装Logstash

  • 创建安装目录
[chenlei@chenlei ~]$ sudo mkdir /usr/local/logstash
  • 1
  • 解压缩安装文件
[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
  • 1
  • 2
  • 3
  • 测试安装是否成功

    • 测试一、快速启动,标准输入输出作为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
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 测试二、在测试一堆基础上加上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"
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

三、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
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 数据类型

      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 {
  ...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 环境变量引用

      Logstash支持引用系统环境变量,环境变量不存在时可以设置默认值,例如:

export TCP_PORT=12345
  • 1
input {
  tcp {
    port => "${TCP_PORT:54321}"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5

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

3.1、File读取插件

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

  • 配置事例
input
  file {
    path => ["/var/log/*.log", "/var/log/message"]
    type => "system"
    start_position => "beginning"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 常用参数
参数名称 类型 默认值 描述信息
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
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 常用参数(空 => 同上)
参数名称 类型 默认值 描述信息
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
}
  • 1
  • 2
  • 3
  • 常用参数(空 => 同上)
参数名称 类型 默认值 描述信息
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"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 常用参数(空 => 同上)
参数名称 类型 默认值 描述信息
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 {
}
  • 1
  • 2
  • 常用参数(空 => 同上)
参数名称 类型 默认值 描述信息
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}"}
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

​ 输出结果:

client: 55.3.244.1
method: GET
request: /index.html
bytes: 15824
duration: 0.043
  • 1
  • 2
  • 3
  • 4
  • 5
  • 自定义表达式调用 
    • 语法:(?<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}
  • 1
  • 2

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

## 日志内容 ##
Jan  1 06:25:43 mailserver14 postfix/cleanup[21403]: BEF25A72965: message-id=<20130101142543.5828399CCAF@mailserver14.example.com>
  • 1
  • 2
## Logstash配置 ##
filter {
  grok {
    patterns_dir => ["./patterns"]
    match => { "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
## 运行结果 ##
timestamp: Jan 1 06:25:43
logsource: mailserver14
program: postfix/cleanup
pid: 21403
queue_id: BEF25A72965
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 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 => ...
}
  • 1
  • 2
  • 3
## 事例配置,message是JSON格式的字符串:"{\"uid\":3081609001,\"type\":\"signal\"}" ##
filter {
    json {
        source => "message"
        target => "jsoncontent"
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
## 输出结果 ##
{
    "@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"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 常用配置参数(空 => 同上)
参数名称 类型 默认值 描述信息
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
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 常用配置参数(空 => 同上)
参数名称 类型 默认值 描述信息
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"
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 常用配置参数(空 => 同上)
参数名称 类型 默认值 描述信息
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}"}
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 常用配置参数(空 => 同上)
参数名称 类型 默认值 描述信息
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 => ...
}
  • 1
  • 2
  • 3
  • 4
  • 常用配置参数(空 => 同上)
参数名称 类型 默认值 描述信息
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 {
}
  • 1
  • 2
  • 常用配置参数
参数名称 类型 默认值 描述信息
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"
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

五、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参考资料

猜你喜欢

转载自blog.csdn.net/bujidexinq/article/details/80835011
今日推荐