input
-
input 插件指定数据输入源,一个pipeline可以有多个input插件,我们主要讲解下面的几个input插件:
- stdin - file - kafka
Input Plugin – stdin
最简单的输入,从标准输入读取数据,通用配置为:
- codec类型为codec
- type类型为string ,自定义该事件的类型,可用于后续判断(请看下面详解)
- tags类型为array ,自定义该事件的tag ,可用于后续判断
- add_field类型为hash ,为该事件添加字段
input{
stdin{
codec=>"plain"
tags=>["test"]
type=>"std"
add_field=>{"key"=>"value"}
}
}
output{
stdout{
codec=>"rubydebug"
}
}
Input Plugin-file
从文件读取数据,如常见的日志文件。文件读取通常要解决几个问题:
-
文件内容如何只被读取一次?即重启L时,从上次读取的位置继续
- sincedb
-
如何即时读取到文件的新内容?
- 定时检查文件是否有更新
-
如何发现新文件并进行读取?
- 可以,定时检查新文件
-
如果文件发生了归档(rotation)操作,是否影响当前的内容读取?
- 不影响,被归档的文件内容可以继续被读取
理论实现源码:
关键配置
-
path类型为数组,指明读取的文件路径,基于glob匹配语法
path => ["/var/log/*/*log", “/var/log/message”] -
exclue类型为数组排除不想监听的文件规则,基于glob匹配语法
exclude => “*.gz” -
sincedb-path类型为字符串,记录sincedb文件路径
-
start-postion类型为字符串, beginning or end ,是否从头读取文件
-
stat interval类型为数值,单位秒,定时检查文件是否有更新,默认1秒
-
discover interval类型为数值,单位秒,定时检查是否有新文件待读取,默认15秒
-
ignore-older类型为数值,单位秒,扫描文件列表时,如果该文件上次更改时间 1 超过设定的时长,则不做处理,但依然会监控是否有新内容,默认关闭
-
close older类型为数值,单位秒,如果监听的文件在超过该设定时间内没有新内容,会被关闭文件句柄,释放资源,但依然会监控是否有新内容,默认3600秒,即1个小时
Input Plugin – glob匹配语法
举例说明
实际使用中的列子如下:
调试文件输入时的常用配置如下:
Input Plugin - kafka
Kafka是最流行的消息队列,也是Elastic Stack 架构中常用的,使用相对简单
codec插件详解
Codec Plugin
Codec Plugin作用于input和output plugin ,负责将数据在原始与LogstashEvent之间转换,常见的codec有:
- plain读取原始内容
- dots将内容简化为点进行输出
- rubydebug将Logstash Events按照ruby格式输出,方便调试
- line处理带有换行符的内容
- json处理json格式的内容
- multiline处理多行数据的内容
plain插件:
主要用于事件之间没有分隔的纯文本。
使用:
input {
stdin {
codec => plain {}
}
}
示例:
logstash事件output到kafka默认的codec为json,如果设置codec为plain,除了message数据之外还会有一个主机名和时间戳的字段生成,如果只需要message字段,配置如下:
output {
kafka {
codec => plain {
format => "%{message}"
}
}
}
json插件:
如果数据为json格式,可直接使用该插件,从而省掉filter/grok的配置,降低过滤器的cpu消耗
使用:
input {
stdin {
codec => json
}
}
multiline插件:
用于合并多行数据
有些时候,应用程序调试日志会包含非常丰富的内容,为一个事件打印出很多行内容。这种日志通常都很难通过命令行解析的方式做分析。multiline插件用于解决此类问题。
示例:
tomcat的日志catalina.out有很多调试的日志,日志都以时间戳格式"20-Apr-2016 11:29:28.535"开头,那么我们可以配置如下:
input {
file {
path => "/path/to/catalina.out"
start_position => "beginning"
type => "tomcat_log"
codec => multiline {
pattern => "^%{MONTHDAY}[./-]%{MONTH}[./-]%{YEAR}"
auto_flush_interval => 10
negate => true
what => "previous"
}
}
}
- pattern为正则表达式匹配
- negate为布尔类型,true表示否定正则表达式,即不匹配正则表达式。false为匹配正则表达式。默认值为false
- what表示如果正则匹配与否,事件属于上一个或者下一个事件。有两个值可选previous(上一个)或者next(下一个)
- auto_flush_interval表示当多长时间没有新的数据,之前积累的多行数据转换为一个事件。这里的10表示10秒
以上的配置可以解释为:不匹配pattern时间戳格式开头的行数据,都归属到上一个事件中,即在下一个匹配的时间戳出现之前的所有行的输出都属于同一个事件,从而达到合并多行的目的,同时等待10秒没有新数据产生,那么最后一个时间戳格式后的所有行数据就是最后一个事件。