Logstash是一个数据采集、加工处理以及传输的工具
• 特点:
– 所有类型的数据集中处理;
– 不同模式和格式数据的正常化;
– 自定义日志格式的迅速扩展;
– 为自定义数据源轻松添加插件;
Logstash安装:
– Logstash依赖Java环境,需要安装java-1.8.0-openjdk
– Logstash没有默认的配置文件,需要手动配置
– Logstash安装在/opt/logstash目录下
# yum –y install logstash
#yum –y install java-1.8.0-openjdk
Logstash工作结构:
{ 数据源 } ==>
input { } ==>
filter { } ==>
output { } ==>
{ ES }
Logstash类型及条件判断:
Logstash里面的类型:
– 布尔值类型: ssl_enable => true
– 字节类型:bytes => "1MiB"
– 字符串类型: name => "xkops"
– 数值类型: port => 22
– 数组: match => ["datetime","UNIX"]
– 哈希: options => {k => "v",k2 => "v2"}
– 编码解码: codec => "json"
– 路径: file_path => "/tmp/filename"
– 注释: #
Logstash条件判断:
– 等于: ==
– 不等于: !=
– 小于: <
– 大于: >
– 小于等于: <=
– 大于等于: >=
– 匹配正则: =~
– 不匹配正则: !~
– 包含: in
– 不包含: not in
– 与: and
– 或: or
– 非与: nand
– 非或: xor
– 复合表达式: ()
– 取反符合: !()
Logstash配置文件(没有配置文件,需要自己书写):
[root@logstash ~]# mkdir /etc/logstash
[root@logstash ~]# vim /etc/logstash/logstash.conf
input{
stdin{}
}
filter{ }
output{
stdout{}
}
这是logstash的基本格式,需要定义输入日志input, 定义输入文件处理规则(更改日志结构), 最后需要将更改后的日志输出到elaticsearch之类的软件中
启动并验证:
[root@logstash ~]# /opt/logstash/bin/logstash -f /etc/logstash/logstash.conf
Logstash插件:
上面的配置文件使用了logstash-input-stdin和logstash-output-stdout两个插件, Logstash还有filter和codec类插件,查看插件的方式是:
[root@logstash ~]#/opt/logstash/bin/logstash-plugin list //会列出所有在input, filter 和 output中使用的插件
filter grok插件:
– 解析各种非结构化的日志数据插件;
– grok使用正则表达式把飞结构化的数据结构化;
– 在分组匹配,正则表达式需要根据具体数据结构编写;
– 虽然编写困难,但适用性极广;
– 几乎可以应用于各类数据.
grok{
match => {"message" => "%{COMBINEDAPACHELOG}"} //宏的调用方法
}
grok{
match => {"(?<key>reg)"} //正则的调用方法
}
案例:
[root@logstash ~]#vim /etc/logstash/logstash.conf
input{
# file { #file指名进入的数据是文件类型
# path => ["/var/log/a.log"] #本机的服务日志文件路径,因为web服务在web_httpd上搭建的,所一这一段注释掉
# start_position => "beginning" #设置logstash从日志的哪个位置开始读取
# sincedb_path => "/dev/null" #logstash默认会从上次读取的位置继续读,将存储读取位置的文件路径设置为黑洞,会始终从头开始读取日志信息
# type => "testlog" #给日志打一个标记
# }
beats { #打开5044端口,通过filebeat从web_http服务器上获取日志信息
port => 5044
}
}
filter{ #filter是对数据进行处理的过程
grok { #grok正则分组匹配,利用正则表达式将日志机构化,可以自己写,也可以直接调用软件的宏
match => {"message" => "%{COMBINEDAPACHELOG}"}
}
}
output{ #将处理过的数据传输给ES集群
if [type] == "apache_log" { #判断语句,apache_log是在filebeat中定义的: document_type: apache_log (72行)
elasticsearch {
hosts => ["es1:9200","es2:9200","es3:9200"] #主机名多定义几台,备用
index => "weblog" #定义这个日志的索引名
flush_size => 2000
idle_flush_time => 10
}
}
}
filter日志结构处理可以改为下面内容(自定义正则表达式):
filter{
grok{
match => {"message" => "(?<client_ip>[0-9.]+).+\[(?<time>.+)\] \"(?<method>[A-Z]+) (?<url>\S+) (?<proto>[A-Z]+)\/(?<version>[0-9.]+)\" (?<return_code>[0-q]+) (?<size>[0-9]+)" }
}
}
插件及帮助文档地址:
https://www.elastic.co/guide/en/logstash/current/index.html
logstash的配置文件,日志的结构化既可以自己使用正则表达式来书写,也可以通过调用软件本身的宏来直接调用,宏所在的文件位置如下:
[root@logstash ~]#vim /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/grok-patterns