logstash简介
- 是一个数据采集、加工处理以及传输的工具
- 特点
- 所有类型的数据集中处理
- 不同模式和格式数据的正常化
- 自定义日志格式的迅速扩展
- 为自定义数据源轻松添加插件
安装logstash
- 主机配置要求最低2核CPU2G内存
[root@logstash ~] rsync -av 192.168.1.252:/etc/hosts /etc/ #同步主机名解析
[root@logstash ~] yum -y install java-1.8.0-openjdk logstash #需要jdk运行环境
- 没有默认的配置文件,需要手写,安装路径在
/opt/logstash/
[root@logstash ~] vim /etc/logstash/logstash.conf
input{
stdin{}
}
filter{}
output{
stdout{}
}
#写入验证配置,作用类似echo,输入什么输出什么
[root@logstash ~] /opt/logstash/bin/logstash -f /etc/logstash/logstash.conf #启动程序,-f 指定配置文件路径及文件名
Settings: Default pipeline workers: 2
Pipeline main started #表示启动成功
test #输入test
2020-02-24T04:02:22.790Z logstash test #输出test,则服务正常
logstash使用
1)类型
布尔值类型:ssl_enable => true
字节类型:bytes => "1MiB"
字符串类型:name => "xkops"
数值类型:port => 22
数组:match => ["datetime","UNIX"]
哈希:options => {k => "v",k2 => "v2"}
编码解码:codec => "json"
路径:file_path => "/tmp/filename"
注释:#
2)条件判断
等于 ==
不等于 !=
小于 <
大于 >
小于等于 <=
大于等于 >=
匹配正则 =~
不匹配正则 !~
包含 in
不包含 not in
与 and
或 or
非与 nand
非或 xor
复合表达式 ()
取反复合 !()
3)插件
1. codec类插件
- 常用的插件:plain、json、json _lines、rubydebug、multiline等
] vim /etc/logstash/logstash.conf
input{
stdin{ codec => "json" }
}
filter{}
output{
stdout{ codec => "rubydebug" }
}
] /opt/logstash/bin/logstash -f /etc/logstash/logstash.conf
2. input file插件
] vim /etc/logstash/logstash.conf
input{
file{
start_position => "beginning"
sincedb_path => "/var/lib/logstash/sincedb-access"
path => [ "/tmp/a.log", "/tmp/b.log" ]
type => 'filelog'
}
sincedb_path
记录读取位置文件的路径和文件名start_position
配置第一次读取文件从什么地方开始,值为[“beginning”,“end”],默认为"end"。配置为beginning时,第一次从文件开头进行读取,并将已读取的位置记录到sincedb_path指定的文件中,下一次读取时会从这个文件查看记录的位置并读取未读取的部分,保证记录完整性type
相当于给日志打标签path
指定要读取的日志文件
3.filter grok插件
- 解析各种非结构化的日志数据插件
- grok使用正则表达式把飞结构化的数据结构化
- 在分组匹配,正则表达式需要根据具体数据结构编写
- 虽然编写困难,但适用性极广
- 几乎可以应用于各类数据
filter{
grok{
match => { "message" => "%{IP:client_ip}"}
}
}
- grok正则分组匹配
-
匹配ip时间戳和请求方法
-
使用正则宏,正则宏查询文件
/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/grok-patterns
-
filter {
grok {
match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
}
或者:
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"} #正则宏名
}
}
4.output ES插件
- 主要作用为将数据写入es集群
output{
if [type] == "apache_log"{ #if的作用是将type为这个VALUE的日志数据写入,其他的不写入,达到多种服务的日志区分的目的
elasticsearch{
hosts => ["192.168.1.51:9200", "192.168.1.52:9200", "192.168.1.53:9200"] #es集群主机和端口
index => "logstash-apache" #索引名
flush_size => 2000 #数据大小达到2000字节时才写入一次
idle_flush_time => 10 #数据写入空闲10s时,写入一次数据
}}
}
5.input filebeats插件
- 这个插件主要用来接收beats类软件发送过来的数据,由于logstash以来JAVA环境,而且占用资源非常大,所以使用更轻量的filebeats替代,将logstash独立出来处理日志
beats{
port => 5044
}
例:
input {
beats {
port => 5044
}
}
filter{
if [type] == "http_log"{
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}}
}
output{
#stdout{ codec => "rubydebug" }
if [type] == "http_log"{
elasticsearch {
index => "weblog"
hosts => ["192.168.1.51:9200", "192.168.1.52:9200", "192.168.1.53:9200"]
flush_size => 2000
idle_flush_time => 10
}}
}
web服务器安装filebeat
] yum -y install filebeat
] vim /etc/filebeat/filebeat.yml
15 - /var/log/access_log #数组格式,可以写多个文件
72 document_type: http_log #设置发送的日志的type,作用是再logstash服务器匹配对应的规则
183 #elasticsearch: #注释掉elasticsearch相关配置
188 #hosts: ["localhost:9200"] #注释掉elasticsearch相关配置
278 logstash: #打开注释
280 hosts: ["192.168.1.57:5044"] #打开注释,指定logstash服务器ip和监听的端口
] systemctl start filebeat
] systemctl enable filebeat
如果kibana使用时报错:Field data loading is forbidden on [xxxx]
,则不要将索引名称设置为logstash-
开头即可,参考