背景:
Centos7.3 Linux系统,服务器内网防火墙处于关闭状态;
之前已经在三台服务器上安装好了ES集群(10.3.1.8、10.3.1.9、10.3.1.13),每台单实例,互相已配置SSH免密登录。服务器本身安装好了JDK1.8,配置好了环境变量。
由于Logstash具备相当的独立性,我把它放在10.3.1.14这台机器上
还没安装ES的可以参考我之前写的ES集群安装文档:
Linux下安装 ElasticSearch 5.4.0 集群全过程(包括head插件)
1.官网手动下载:https://www.elastic.co/downloads/past-releases
注意版本对应ES的版本:(我全部都选择5.4.0)
2.服务器在线下载:
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.4.0.tar.gz
我暂时是把 Logstash 和 Kibana 都放在 10.3.1.14 这台机器上
logstash没这么多讲究,随便找个目录安装就行,我是放在 /home/logstash/logstash-5.4.0 下
注:此处只是简单测试下Logstash的基本功能
1.接收控制台输入,Logstash解析输出到控制台
在Logstash目录下创建test文件夹:
[root@cdh4 logstash-5.4.0]# mkdir test
[root@cdh4 logstash-5.4.0]# cd test
[root@cdh4 test]# vim std_std.conf
在test目录下创建 std_std.conf 文件,添加内容:
input {
stdin{
}
}
output {
stdout{
}
}
然后到bin目录下启动Logstash(基于std_std.conf):
./logstash -f ../test/std_std.conf
2.从文件读取,Logstash解析输出到控制台
我是从取出tomcat的当天access_log作为读取文件,没有该文件的可以复制下面一段内容做成测试文件
[root@cdh4 test]# vim access_log.2018-04-10.log
10.2.17.9 - - [10/Apr/2018:09:06:22 +0800] "GET /static/logshow/css/component.css HTTP/1.1" 304 -
10.2.17.9 - - [10/Apr/2018:09:06:22 +0800] "GET /static/logshow/js/EasePack.min.js HTTP/1.1" 304 -
10.2.17.9 - - [10/Apr/2018:09:06:22 +0800] "GET /static/logshow/js/TweenLite.min.js HTTP/1.1" 304 -
10.2.17.9 - - [10/Apr/2018:09:06:22 +0800] "GET /static/logshow/js/rAF.js HTTP/1.1" 304 -
10.2.17.9 - - [10/Apr/2018:09:06:22 +0800] "GET /static/logshow/js/demo-1.js HTTP/1.1" 304 -
10.2.17.9 - - [10/Apr/2018:09:06:22 +0800] "GET /static/logshow/img/demo-1-bg.jpg HTTP/1.1" 304 -
10.2.17.9 - - [10/Apr/2018:09:06:30 +0800] "GET / HTTP/1.1" 302 -
10.2.17.9 - - [10/Apr/2018:09:06:30 +0800] "GET /login HTTP/1.1" 200 3271
10.2.17.9 - - [10/Apr/2018:09:06:36 +0800] "POST /login HTTP/1.1" 302 -
10.2.17.9 - - [10/Apr/2018:09:06:36 +0800] "GET / HTTP/1.1" 200 11776
10.2.17.9 - - [10/Apr/2018:09:06:36 +0800] "GET /static/css/font-awesome.min.css?v=4.4.0 HTTP/1.1" 304 -
在test目录下创建 file_std.conf 文件,添加内容:
input{
file{
path =>"/home/logstash/logstash-5.4.0/test/access_log.2018-04-10.log"
start_position=>"beginning"
}
}
filter{
grok{
match=>{
"message"=>"%{DATA:clientIp} - - \[%{HTTPDATE:accessTime}\] \"%{DATA:method} %{DATA:requestPath} %{DATA:httpversion}\" %{DATA:retcode} %{DATA:size} \"%{DATA:fromHtml}\" \"%{DATA:useragent}\""
}
remove_field=>"message"
}
date{
match=>["accessTime","dd/MMM/yyyy:HH:mm:ss Z"]
}
}
output{
stdout{
codec=>rubydebug
}
}
这个配置文件相对比较复杂,而且我们一般在使用elk的时候logstash的配置文件基本也是和这个类似,大同小异了,这里对关键部分详细解说一下。更深入的内容和使用方式,大家可以到elastic官网或者到logstash的最佳实战页面去看,网址是:http://udn.yyuap.com/doc/logstash-best-practice-cn/index.html。
input/file/path:这里指定了要对哪个日志文件进行扫描。如果希望扫描多个文件,可以使用*这个路径通配符;或者使用多个日志路径以数组形式提供(path=>[“outer-access.log”,”access.log”]);或者直接给定一个目录,logstash会扫描所有的文件,并监听是否有新文件。
filter/grok/match/message:里面的DATA和HTTPDATE都是grok语法内置的正则表达式,DATA匹配任意字符,HTTPDATE匹配joda类型的日期格式字符。上例中”[“是匹配“[”。
filter/grok/match/date:是对HTTPDATE日期格式的解释,joda可以支持很多复杂的日期格式,需要在这里指明才能正确匹配。
remove_field=>”message”:用处是去掉原有的整个日志字符串,仅保留filter解析后的信息。你可以试着去掉这一句就明白他的用处了。
然后启动就可以直接看到解析输出到控制台的内容了:
./logstash -f ../test/file_std.conf
3.接收控制台输入,Logstash解析输出到ElasticSearch集群
确保集群三台机器已经启动,其中10.3.1.8是master
在test目录下创建 file_es.conf 文件,添加内容:
input{
stdin {}
}
output {
elasticsearch {
hosts => ["10.3.1.8:9200"]
index => "yj_index"
}
stdout { codec => rubydebug}
}
然后执行测试:
./logstash -f ../test/file_es.conf
可以看到,一切OK!