大家好,我是蓝胖子,之前在构建服务监控实践那个系列里,有提到用logstash来做日志的收集,但是对于logstash的配置文件语法没有做很详细的介绍,今天就来详细聊聊logstash配置文件的语法。
很多时候一门新框架的配置都会有自己独有的配置文件格式,是先简单了解配置文件语法结构,能够让自己更加系统的掌控新框架的各项配置。
文件结构
先来看看logstash的配置文件结构,配置文件分为3部分,input输入,filter过滤,output输出。配置文件是以{} 来定义区段的。如下,
lua
input { }
filter { }
output { }
顾名思义,它们分别表示logstash的输入来源,输入来源可以是文件,filebeat等等。filter则是定义对输入源内容进行二次处理,过滤提取等等。outpout则是将处理后的内容重新输出到其他组件,比如elasticsearch或者通过http接口输出到自定义服务中。
插件
在每一个区段内,可以引入logstash的插件,插件的配置同样也是用{}包裹起来的。如下,我在input区域内部定义了stdin和syslog插件。
lua
input { stdin {} syslog {} }
不过通常在filebeat和logstash搭配使用时,通常是将logstash的输入来源定义为filebeat的插件,如下
lua
input {
beats {
port => 5044
}
}
而filebeat的配置文件中,则是将输出源设置为logstash,如下是filebeat的部分配置文件示例,
yml
output.logstash:
hosts: 192.168.0.2:5054
不同的插件具体有哪些配置,有哪些插件可以使用,参考官方文档 www.elastic.co/guide/en/lo...
语法规则
介绍了配置文件的结构后,我们来看看配置文件的语法规则。
声明赋值变量
在配置文件中,赋值一个变量使用的是=>符号,像前面提到把输入源定义为filebeat时,就将port变量赋值为5044了。
lua
port => 5044
除了数值类型,logstash还会有字符串,布尔,数组,hash类型,它们写法如下,
字符串类型
lua
host =>"hostname"
布尔类型
lua
debug => true
数组类型
lua
match => ["datetime", "UNIX", "ISO8601"]
hash类型
lua
options => { key1 =>"value1", key2 =>"value2" }
引用变量
声明赋值完变量后,如何引用呢,在logstash中是通过[]对变量进行引用,如下,我声明了一个变量debug, 然后引用它。
lua
filter {
debug => true
}
output {
if [debug]==true {
...
}
}
如果是那种结构体类型,比如json,或者hash结构,那么可以使用多重[]得到其值,如下,
lua
output {
options => { key1 =>"value1", key2 =>"value2" }
if [options][key1]=="2" {
...
}
}
内插变量
logstash还支持内插变量,如下,我在使用elasticsearch插件时,需要定义输出的索引名称,这个名称是根据日志来源中不同的内容建立不同的索引名称。[fields][log_type]引用的则是出入来源中的变量名。
lua
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "easymonitor-%{[fields][log_type]}-%{+yyyy.MM.dd}"
}
}
条件判断
其实在介绍变量引用的时候,你应该已经看到if语句,除此以外if else语句也是支持的。如下所示,
lua
if "_grokparsefailure" not in [tags] {
...
} else if [status] !~ /^2\d\d/ and [url] == "/noc.gif" {
...
} else {
...
}
logstash支持的判断表达式包括
yml
比较大小: ==, !=, <, >, <=, >= ·
正则: =~, !~
包含关系: in, not in
布尔表达式: and, or, nand, xor
对表达式取反操作: !(表达式)
注意logstash是不支持&& 和 || 表示并且和或关系的,应该用and 和or代替。
条件表达式定义多个输出源
使用条件表达式,在条件表达式中定义不同的输出插件,达到根据不同内容输出到不同组件的目的,以下是配置案例,通过判断日志的等级,等级为error或者日志类型是es的日志时,则输出到报警服务中。
lua
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "easymonitor-%{[fields][log_type]}-%{+yyyy.MM.dd}"
}
if [loglevel] == "Error" or [fields][log_sub_type]=="es" {
http {
http_method => "post"
url => "http://192.168.0.2:36060/alert_log"
}
}
}
总结
logstash的配置文件语法还算是很简单的,灵活的使用条件表达式可以定义多个输出源,想要掌握logstash更多的配置还是要去官网掌握一些插件的用法,不过在看懂语法的基础上,学习插件的用法就是水到渠成的事情了。