logstash的安装及使用
Logstash是一款开源的的数据收集、处理、传输工具,logstash可以处理日志、事件及非结构化的数据,并可以将他们输出,或输出到elasitcsearch。
Logstash是由java语言所研发。所以,在安装logstash前需要安装javajdk(选择安装openjdk1.8版本安装)
安装openjdk:
]# yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y
]# java -version
openjdk version "1.8.0_144"
OpenJDK Runtime Environment (build 1.8.0_144-b01)
OpenJDK 64-Bit Server VM (build 25.144-b01, mixed mode)
下载安装logstash:
]# wget https://artifacts.elastic.co/downloads/logstash/logstash-5.5.2.rpm
]# rpm -ivh logstash-5.5.2.rpm
warning: logstash-5.5.1.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:logstash-1:5.5.1-1 ################################# [100%]
Using provided startup.options file: /etc/logstash/startup.options
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Successfully created system startup script for Logstash
为了使用logstash,需要创建logstash的配置文件,配置文件中指定了使用的插件和每个插件的设置。Logstash的配置文件主要由三部分组成,input指定收集的数据来源,output指定数据输出到哪里去,filter对数据进行过滤和替换。创建完成logstash的配置文件就可以启动logstash。
使用root用户启动logstash时,有时会报错,所以,一般使用logstash用户启动logstash,如果使用rpm包安装logstash,logstash用户会在安装时自动创建,我们只需修改logstash用户登陆的shell即可切换到logstash用户登录logstash。
修改logstash用户的登录shell:
]# usermod logstash -s /bin/bash
创建一个简单的logstash的配置文件(通过接受标准的输入,再通过ruby的格式通过标准的格式输出):
]# cat /etc/logstash/conf.d/logstash-simple.conf
input {
stdin{
type => "stdandardinput"
}
}
output {
stdout { codec => rubydebug }
}
检查配置文件语法是否错误:
$ /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -t -f /etc/logstash/conf.d/logstash-simple.conf
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
Configuration OK
配置文件语法正常,现在可以正常启动logstash,正常启动后,会提示输入,输入字符串,由于在配置文件中,输出为以ruby的格式输出,所以会将输入的字符串以ruby的格式输出。
$ /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/logstash-simple.conf
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
The stdin plugin is now waiting for input:
hello world
{
"@timestamp" => 2017-09-26T02:53:46.919Z,
"@version" => "1",
"host" => "elk1",
"message" => "hello world",
"type" => "stdandardinput"
}
Logstash可以将系统及服务的日志实时的收集后,经过处理发送给elasticsearch,也可以接受filebeat或redis的的日志经过处理后再发送给elasticsearch。Logstash的原理如图1所示
图1 logstash的原理
(1)logstash接受日志
Logstash接受日志是通过input插件来完成的,可以实时的接受系统指定的日志文件产生的日志,也可以接受filebeat发送过来的日志,亦可去redis指定的队列中读取日志。将日志接受进来后将交由filter插件过滤或直接由output插件输出。如,实时接受本地系统日志则可以写为:
input {
file {
path => ["/var/log/messages"]
type => "system"
start_position => "beginning"
}
}
读取redis数据库日志则可以写为:
input {
redis {
host => “redis ipadd”
port=> 6379
key=> “KEY”
rassword=> “redis password”
}
}
接受filebeat的日志则写法为:
input {
beats {
Host => “filebeat ipaddr”
port => 5044
}}
(2)对日志进行过滤
将本地的日志直接发送给elasticsearch是没有意义的,这样不易于在kibana中通过聚合图来展示分析日志。在将日志发送给elasticsearch前,很有必要做一下过滤,将过滤完的日志再发送给elasticsearch,这样有利于使用kibana对日志数据进行分析。Logstash过滤日志是通过filter及grok插件来实现的。
使用grok时,只需调用定义好的正则表达式规则即可进行数据的过滤,调用的方式为“%[定义好的规则:key]”,grok默人定义了许多匹配规则,存放路径为:/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.1.1/patterns/目录下的grok-patterns文件中,如果匹配规则不够使用,则可以自行在配置文件中定义。
如果过滤nginx的默认配置文件,则过滤filter的写法规则如下:
Centos7下Nginx的默认日志输出格式为:
10.0.0.12 - - [29/Sep/2017:19:44:42 -0400] "GET / HTTP/1.1" 200 3700 "-" "curl/7.29.0" "-"
日志格式为:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
Nginx默认日志filter的过滤规则可写为:
filter {
grok {
match => {
"message" => "%{IPORHOST:clientip} \[%{HTTPDATE:time}\] \"%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:http_status_code} %{NUMBER:bytes} \"(?\S+)\" \"(?\S+)\" \"(?\S+)\""
}
}
}
过滤后输出的日志格式为:
request:/ offset:10,829 auth:- http_status_code:200 ident:- input_type:log verb:GET source:/var/log/nginx/access.log message:10.0.0.13 - - [30/Sep/2017:01:54:07 -0400] "GET / HTTP/1.1" 200 3700 "-" "curl/7.29.0" "-" type:log tags:beats_input_codec_plain_applied http_user_agent:curl/7.29.0 datetime:30/Sep/2017:01:54:07 -0400 @timestamp:September 30th 2017, 13:54:07.702 bytes:3700 http_referer:- clientip:10.0.0.13 @version:1
(3)使用output插件将日志输出
Logstash是一款接受处理日志的系统,无存储日志的功能,经过input和filter接受处理完日志,需要将日志发送出去,发送日志由output插件来完成。Logstash可以将日志发送给elasticsearch,也可将日志发送给redis或将日志输出,也可同时将日志发送到多个地方。如将日志发送给elasticsearch写法为:
Output {
elasticsearch {
hosts => ["10.0.0.11:9200"]
index => "logstash-nginxlog-%{+YYYY.MM.dd}"
}}
(1)使用logstash接收处理filebeat发送的日志。
Logstash是一款功能强大的日志收集处理系统,但运行起来对系统的资源消耗大,所以一般不直接使用logstash去收集系统服务日志,先由filebeat收集系统日志,收集后再发送给logstash处理,logstash可单独部署在一台服务器上用于接受处理filebeat发送过来的日志。Filebeat需要配置为将日志发送给logstash,filebeat的配置为(其他不发送的需注释掉):
]# sed -n 91,94p /etc/filebeat/filebeat.yml
#-------------------Logstash output----------------------
output.logstash:
# The Logstash hosts
hosts: ["10.0.0.13:5044"]
Logstash接受filebeat发送来的日志处理完成后再发送给elasticsearch,logstash的配置为:
#] cat /etc/logstash/conf.d/test.conf
input {
beats {
host => '0.0.0.0'
port => 5044
}
}
filter {
grok {
match => {
"message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:dat
etime}\] \"%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:http_status_code
} %{NUMBER:bytes} \"(?\S+)\" \"(?\S+)\" \"(?\S+)\
""
}
}
}
output {
elasticsearch {
hosts => ["10.0.0.11:9200"]
index => "logstash-nginxlog-%{+YYYY.MM.dd}"
}
}
配置完成后则可以测试配置语法并启动logstash来收集日志
$ /usr/share/logstash/bin/logstash -t -f /etc/logstash/conf.d/test.conf
$ /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf
接下来就可以在kibana中创建索引来查询elasticsearch中接受到的日志信息了,因为我们在output中定义了index,所以查询名称可以写为“logstash-nginxlog-*”,如下图2所示:
图二 在kibana中创建索引
索引创建完,可模拟访问nginx,让产生日志,kibana中查到到的日志如图三所示:
图三 kibana中接受到的日志
(2)Logstash从redis中读取处理日志并发送给elasticsearch
Logstash接受处理日志也有一定的量,如果大量的日志发送给logstash去处理,超过了logstash接受处理日志的能力,则可能会导致logstash挂掉,对于这种情况,可使filebeat将日志发送给redis,logstash从redis中去读取日志,处理完再发送给elasticsearch。处理流程如图四所示。
图四 logstash从redis读取处理日志
此时,需要安装redis服务(数据量大时,可对redis做集群)。需要修改filebeat配置文件将接受日志发给redis,修改logstash配置文件从redis队列中读取数据。
Centos7.2epel yum 源中带有redis可直接进行安装并启动redis,redis服务默认端口为6379。
安装redis:
]# yum install redis -y
安装完成后需要修改默认绑定的redis ip地址,默认为127.0.0.1,修改为当前主机ip地址或主机名(设置为主机名时个服务节点需要能解析)。
]# sed -i "s#bind 127.0.0.1#bind 10.0.0.14#g" /etc/redis.conf
修改完配置文件则可以启动redis:
]# systemctl start redis.service
配置filebeat将日志发送给redis,在filebeat配置文件中将其他的输出项注释掉,并添加输出为redis,添加的配置内容为:
#------------------------ REDIS -----------------------
output.redis:
hosts: [10.0.0.12:6379]
key: "filebeat"
db: 0
timeout: 5
修改完配置后需重启filebeat:
]# systemctl restart filebeat
修改完filebeat配置文件,也要修改logstash配置文件从redis对列中读取数据,则logstash的input配置为:
input {
redis {
host => '10.0.0.12'
port => 6379
key => "filebeat"
data_type => "list"
}
}
配置完成后则可以启动logstash,也可登录redis查看是否有数据,亦可在kibana中创建索引来查看生成的日志。
关于更多的logstash的配置与使用可参考elk官方文档(https://www.elastic.co/guide/en/logstash/5.2/index.html)