Logstash的基本知识
Logstash是什么
logstash是开源数据收集引擎,可以用数据的统一和扩充。
相关版本支持(看这里)
工作原理(看这里)
- 输入
file:从文件系统上的文件读取,非常类似于UNIX命令tail -0F
syslog:在知名端口514上侦听syslog消息并根据RFC3164格式进行解析
redis:使用redis通道和redis列表从redis服务器读取。Redis经常在集中式Logstash安装中用作“代理”,该安装会将来自远程Logstash“托运人”的Logstash事件排队。
beats:处理 Filebeat和其他beat发送的数据 - 过滤器(使用方式)
date:用于完成日期转换,可以将日期类型的字符串生成为一个新的字段,用以替代默认的
json:将字段内容转为JSON格式
grok:将符合某个正则规则的内容重新定义为另一个字段中。Logstash预定义了很多的正则规则,通过这些文件还可以学习到很多正则高级写法,这些规则存放在以下目录:/usr/
local
/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns
mutate:该插件也是使用很频繁的插件,可以对字段内容做处理,比如重命名,删除,替换和修改事件中的字段。
dissect:基于分割符来切割字段,避免grok消耗CPU的问题,性能是grok的三倍左右。但是需要每行日志格式相似,并有明显的分割符
geoip:添加有关IP地址地理位置的信息(还在Kibana中显示惊人的图表!)
fingerprint :创建一个或多个字段的一致哈希(指纹),并将结果存储在新字段中。 - 输出
流行的Logstash输出插件
file:输出到文件
email:收到输出时,它会根据某些条件发送电子邮件
elasticsearch:输出到elasticsearch集群,这是Logstash最常见和最推荐的输出
stdout:标准输出流
redis:事件写入redis队列,并用作许多ELK实现的代理
mongodb:输出到mongodb
kafka:输出到kafka topic - 编解码器:
编解码器基本上是流过滤器,可以作为输入或输出的一部分进行操作。编解码器使您可以轻松地将消息的传输与序列化过程分开。流行的编解码器有:
json:以JSON格式编码或解码数据。
plain插件:主要用于事件之间没有分隔的纯文本。
multiline:将多行文本事件(例如java异常和stacktrace消息)合并为一个事件。
执行模型
Logstash事件处理管道协调输入,过滤器和输出的执行。
Logstash在管道阶段(输入→过滤器和过滤器→输出)之间使用内存中有界队列来缓冲事件。为了帮助防止数据丢失,可以持久队列,将正在进行的事件持久保存到磁盘。死信队列为Logstash无法处理的事件提供磁盘存储。默认情况下,死信队列是禁用的。
Logstash配置文件
logstash.yml
包含Logstash配置标志。您可以在此文件中设置标志,而不是在命令行中传递标志。您在命令行上设置的所有标志都将覆盖logstash.yml
文件中的相应设置。有关更多信息,请参见logstash.yml。
pipelines.yml
包含用于在单个Logstash实例中运行多个管道的框架和说明。有关更多信息,请参见多管道。
jvm.options
包含JVM配置标志。使用此文件来设置总堆空间的初始值和最大值。您也可以使用此文件设置Logstash的语言环境。在单独的行上指定每个标志。此文件中的所有其他设置都被视为专家设置。
log4j2.properties
包含log4j 2
库的默认设置。有关更多信息,请参见Log4j2配置。
startup.options
(Linux)
在安装Logstash软件包时,system-install
脚本将在安装过程结束时执行,并使用中指定的设置startup.options
来设置选项,例如用户,组,服务名称和服务描述。
Logstash.config(看这里)
基本结构:
input {
插件{
具体插件配置,插件的配置包括插件名称,后跟该插件的一组设置
name => value
}
}
filter {
插件{
具体插件配置
}
}
output {
插件{
具体插件配置
}
}
插件配置值的支持数据类型:
- Array:users => [ {id => 1, name => bob}, {id => 2, name => jane} ]
- Lists:path => [ "/var/log/messages", "/var/log/*.log" ]
- Boolean:ssl_enable => true
- Bytes:my_bytes => "1024" 表示1024个字节
- codec:codec => "json"
- Hash:match => { "field1" => "value1" "field2" => "value2" }
- Number:port => 33
- Password:my_password => "123456"
- URI:my_uri => "http://foo:[email protected]"
- Path:my_path => "/tmp/logstash"
- String:"直接就是一个字符串"
条件语句和临时字段(看这里)
- 使用if条件语句可以在特定条件下过滤或输出事件,语法是:
if EXPRESSION { ... } else if EXPRESSION { ... } else { ... }
- 使用@metadata代表临时字段,可用于条件语句中,该字段的值不会出现这结果集中
Logstash中的通信
同一个Logstash实例中连接多个管道的信息,请参阅多管道和管道到管道通信。
不同的Logstash实例之间建立通信,请使用Logstash到Logstash的通信,或使用中间队列,例如Kafka或Redis。
利用X-Pack配置集中式管道管理
x-pack介绍,在logstash中的可行的配置,在Kibana中配置集中式管道管理