前言

本教程为什么第三节才说到Logstash?
因为本人在阅读其他网络上的相关资料的时候,很多第一篇都是先安装Logstash,最后运行输出elasticsearch没法看出效果,请看下一节之类!到了下一节又没有相关说明,直接又截图出效果,感觉让人懵逼!所以本教程特意把顺序调整了一下。

Logstash安装和使用

Logstash的独立性很强,它的用途就是一个内容的转存系统,通过灵活的插件可以做到很多种类数据的读取和很多种类数据的写入。

Logstash在ELK系统中处在哪个位置?请看下面两种部署方式:

最简单的部署方式:L-E-K

logstash 收集 nginx 日志 logstash日志采集_elasticsearch

第二种方式:由于IO压力问题,我们可以在L-E之间添加一层redis辅助,减轻服务器的压力。

logstash 收集 nginx 日志 logstash日志采集_elk_02

第三种方式:随着业务的增长,服务器部署集群,redis单点故障问题等等,上面的方案已满足不了我们的需求,这个时候我们可以使用Kafka来代替Redis,Kafka相关部署这里不详述,可查看相关资料。

安装Logstash

#下载
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.5.2.tar.gz
#解压到指定目录
tar -xzvf logstash-5.5.2.tar.gz -c /usr/local/
#最终结果/usr/local/logstash-5.5.2/

输入数据源
在bin目录新建配置文件std_std.conf

cd /usr/local/logstash-5.5.2/bin/
vi std_std.conf

配置内容

input {
    stdin{
    }
}

output {
    stdout{
    }
}

在bin目录执行命令:./logstash -f std_std.conf
然后输入 hello world

效果如下图:

logstash 收集 nginx 日志 logstash日志采集_elasticsearch_03

nginx日志数据源
以上是以用户输入作为数据源
下面我们使用nginx的日志作为数据源
nginx站点创建本教程不作说明,不懂的同学可以先查看相关资料部署好nginx web站点

如日志内容:

192.168.1.131 - - [30/Aug/2017:17:32:04 +0800] "GET /index.html?a=aaaa HTTP/1.1" 200 230 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; LCTE)" "-"
192.168.1.131 - - [30/Aug/2017:17:32:15 +0800] "GET /index.html?appid=1001 HTTP/1.1" 200 230 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; LCTE)" "-"
192.168.1.131 - - [30/Aug/2017:17:32:22 +0800] "GET /index.html?appid=1001&platform=1 HTTP/1.1" 200 230 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; LCTE)" "-"
......

在bin目录新建配置文件file_std.conf
文件内容如下,path日志路径自行修改

input{
    file{
        path =>"/usr/local/openresty-1.11.2.5/nginx/logs/test.elk.access.log"
        start_position=>"beginning"
    }
}

filter{
    grok{
        match=>{
            "message"=>"%{IPV4:clientip} - - \[%{HTTPDATE:accessTime}\] \"%{DATA:method} %{DATA:requestUri} %{DATA:httpVersion}\" %{DATA:httpCode} %{DATA:size} \"%{DATA:httpReferer}\" \"%{DATA:useragent}\""
        }

        remove_field=>"message"
    }
    date{
        match=>["accessTime","dd/MMM/yyyy:HH:mm:ss Z"]
    }
}

output{
    stdout{
        codec=>rubydebug
    }
}

在bin目录执行命令:./logstash -f file_std.conf
就会看到文件中的内容被逐条的显示出来

Logstash默认提供了能分析包括java堆栈日志、apache日志在内的120种形式,可查看以下资料。
https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns

https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

grok使用
%{匹配规则:输出key}
如上方的
%{IPV4:clientip}
最终匹配输出
clientip:109.12.24.188

更多使用方法可查看相关资料

输出到elasticsearch

在bin目录新建配置文件es_std.conf
文件内容如下:

input{
    file{
        path =>"/usr/local/openresty-1.11.2.5/nginx/logs/test.elk.access.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{
    elasticsearch {
        hosts => "192.168.1.138"
    }
    stdout{
        codec=>rubydebug
    }
}

首先我们运行elasticsearch (参考前两节内容)

su elk
cd /usr/local/elasticsearch-5.5.2
./bin/elasticsearch

确保elasticsearch已启动成功,再运行Logstash
在bin目录执行命令:./logstash -f es_std.conf

logstash 收集 nginx 日志 logstash日志采集_elasticsearch_04

最后启动elasticsearch-head插件

cd /usr/local/elasticsearch-5.5.2/elasticsearch-head
grunt server

在浏览器中打开 http://192.168.1.138:9100/
可以看到效果:

logstash 收集 nginx 日志 logstash日志采集_Logstash_05

这时去访问我们搭建好的nginx站点,如:
http://test.elk.com/index.html?appid=3010&platform=2&channel=10000

那么我们在http://192.168.1.138:9100/中可以实时看到效果(刷新页面)

logstash 收集 nginx 日志 logstash日志采集_elk_06