Logstash是一个开源的、服务端的数据处理pipeline(管道),它可以接收多个源的数据、然后对它们进行转换、最终将它们发送到指定类型的目的地。Logstash是通过插件机制实现各种功能的,读者可以在https://github.com/logstash-plugins 下载各种功能的插件,也可以自行编写插件。
Logstash实现的功能主要分为接收数据、解析过滤并转换数据、输出数据三个部分,对应的插件依次是input插件、filter插件、output插件,其中,filter插件是可选的,其它两个是必须插件。也就是说在一个完整的Logstash配置文件中,必须有input插件和output插件。Logstash的系统结构如下图所示。
- Input
input是将指定的数据作为输入源,一个pipeline可以有多个input插件。
常见的input插件有:
-file:读取文件,一行一行地实时读取
-syslog:监听系统514端口的syslog messages,并使用RFC3164格式进行解析
-redis:从redis服务器读取数据
-kafka:kafka-logstash的架构一般用在数据量较大的业务场景,kafka可用作数据的缓冲和存储
-filebeat:filebeat是一个文本日志收集器,性能稳定,并且占用系统资源很少,logstash可以接收filebeat发送过来的数据
针对上面列举些例子:
1. *stdin标准输入*
2. *file从文件读取数据*
file{
path => '/var/log/nginx/access.log' #要输入的文件路径,该路径可以有多个,它们之间由逗号分开。
type => 'nginx_access_log' #通用选项,用于激活过滤器
start_position => "beginning" #选择logstash开始读取文件的位置,begining或者end。还有一些常用的选项,discover_interval、exiclude、sincedb_path、sincedb_write_interval等可以参考。
}
3.*syslog通过网络将系统日志消息读取为事件*
syslog{
port =>"514" #port指定监听端口(同时建立TCP/UDP的514端口的监听)
type => "syslog"
}
4. *beats从Elastic beats接收事件*
beats {
port => 5044 #要监听的端口
}
5.*kafka 将kafka topic中的数据读取为事件*
kafka{
bootstrap_servers=> "kafka01:9092,kafka02:9092,kafka03:9092"
topics => ["access_log"]
group_id => "logstash-file" #group_id消费者所属组的标识符,默认为logstash。kafka中的一个主题的消息将通过相同的方式分发到Logstash的group_id
codec => "json"
}
kafka{
bootstrap_servers=> "kafka01:9092,kafka02:9092,kafka03:9092"# bootstrap_servers用于建立群集初始连接的kafka实例的URL列表
topics => ["weixin_log","user_log"] #topics 要定语的主题列表
codec => "json" #codec通用选项,用于输入数据的编解码器
}
- filter
filter插件是logstash的主要功能之一,可以对logstash event进行丰富的处理。如类型转换、删除字段等。
常见filter插件filter插件有:
-date:日期解析
-grok:正则匹配解析,通过将一条日志文件解析成一个json形式
-dissect:分割符解析
-mutate:对字段做处理,比如类型转换,字符串处理和字段处理
-json:按照json解析字段内容到指定字段中
-geoip:增加地理位置数据
-ruby:利用ruby代码来动态修改logstash event
针对上面插件列举些例子:
1.date
filter{
date{
match => ["timestamp", "ISO8601" ,"MMM dd yyyy HH:mm:ss"] #match类型为数组,用于指定日期匹配的格式,可以一次指定多种日期格式
target => “@timestamp” #target匹配的是一个string类型,默认值为“@timestamp”,用于指定赋值的字段名
timezone => "UTC" #类型为字符串,用于指定时区
}
}
2.grok
3.geoip
4.json
5.ruby
- output
常见的output插件有:
-elasticsearch:发送数据到elasticsearch
-file:发送数据到文件中
-redis:发送数据到redis中,从这里可以看出redis插件既可以用在input插件中,也可以用在output插件中。
-kafka:发送数据到kafka中,与redis插件类似,此插件也可以用在logstash的输入和输出插件中。