你的位置:首页 > 数据库

[数据库]ELKStack学习笔记


前言:
最近因为工作需要正在研究ELK,为了避免时间一长把ELK的相关知识都忘掉。还是决心费点事,把学习时遇到的详细问题和进展都记录下来。方便自己后续查找资料。如果你也是ELK的初学者,强烈建议先看官方的文档。本文也是针对官方文档做的摘录。所以可能并不全面。仅作为一个ELK的入门者的学习笔记

安装前的准备:

确认java版本,本机安装的版本为1.8.0_45-B14.关于JDK的安装这里不在赘述。

安装logstash:

首先下载logstash包,这里选择了版本1.5.4.
然而执行./logstash agent时报没有指定conf的配置文件。
在百度里搜索了一些ELK的安装文档,但说的都不太明白,故还是决定找官方文档来入门。官方文档地址见参考文献。
我们先按照官方文档写一个简单配置文件例子,做一下测试。以下为一个处理apachelog的logstash配置文件。我们暂时称为例子1.

#设置输入源,这里是从标准输入中读取。input { stdin { } }#设置使用的filter。filter { grok {  #message默认使用了apachelog的模板  match => { "message" => "%{COMBINEDAPACHELOG}" } } date {  #指明了时间格式  match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] }}#定义输出管道,这里一个是输出到本机的elasticSearch中,一个是输出到标准输出中。output { elasticsearch { host => localhost } stdout { codec => rubydebug }}

 将以上内容保存为logstash.conf.然后运行

bin/logstash -f logstash.conf

待启动完毕,在控制台上输入以下文本进行测试

127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/status.php HTTP/1.1" 200 3891 "http://cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0"

回车后我们能看到以下输出。

 Bingo,貌似logstash已经起作用了,它把我们的输入文本,给切分为多个字段了。而且每个字段的命名都比较准确。猜测应该是我们配置了message的模板为"%{COMBINEDAPACHELOG}",而测试的文本也是一个apache的log日志中的一条。

按照官方文档来解释,起作用的是我们配置的“grok”的过滤器。grok按照每种log的格式预先定义了多种模板,只需使用时选定下你的日志适用的grok即可。更多的grok 模板可以从github上去获取。

?可以看到解析后的字段中出现了2处timestamp,一处带着@符号,另一处则是log中解析出来的时间。

OK,第一个例子已经结束。我们已经能看到logstash是如何处理日志文件的思路了。

下面我们在用一个更复杂些的例子来做下说明。这个例子中我们要实际解析一个apache的日志文件了。首先把配置文件贴上来。

 

input { file {  #这里写的是linux下的绝对路径。用户可以根据自己机器情况来修改目录。这次我们过滤以_log为后缀的文件。  path => "/Users/work/tmp/*_log"  start_position => "beginning" }}filter { #条件判断语句,如果路径中有access。 if [path] =~ "access" {  # 增加一个type为apache_access字段的标签。  mutate { replace => { "type" => "apache_access" } }  grok {   match => { "message" => "%{COMBINEDAPACHELOG}" }  }	date {  match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]	} #如果路径中有error,则认为是处理error日志 }else if [path] =~ "error" {  mutate { replace => { type => "apache_error" } } } else {  mutate { replace => { type => "random_logs" } } }}output { elasticsearch {  host => localhost } stdout { codec => rubydebug }}

 

我们把以上文件命名为logstash-apache.conf.然后使用新配置文件启动logstash。启动完毕后,我们在配置中的路径下粘贴一个以_log为后缀的log文件。文件内容如下:

71.141.244.242 - kurt [18/May/2011:01:48:10 -0700] "GET /admin HTTP/1.1" 301 566 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"134.39.72.245 - - [18/May/2011:12:40:18 -0700] "GET /favicon.ico HTTP/1.1" 200 1189 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; .NET4.0C; .NET4.0E)"98.83.179.51 - - [18/May/2011:19:35:08 -0700] "GET /css/main.css HTTP/1.1" 200 1837 "http://www.safesand.com/information.htm" "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"

你会看到控制台上有输出。

 

?为什么输入3条日志,但仅输出2条解析后的日志,少了一条去哪里了?

以上就是一个以条件判断进行日志处理的例子。条件判断语句会非常有用,比如你可以判断下log中的status字段是否是500,如果为500,可以直接发送到nagios中去报警了,非常酷,是不是。如果你需要此功能,参考以下配置,只需要在output中配置就可以了。

output { if [type] == "apache" {  if [status] =~ /^5\d\d/ {   nagios { ... }  } else if [status] =~ /^4\d\d/ {   elasticsearch { ... }  }  statsd { increment => "apache.%{status}" } }}

logstash内置类很多插件,包括支持input插件,output插件,filter插件和codec插件。查看插件可以使用以下命令:

#列出插件bin/plugin list#列出插件,带着插件的版本号 bin/plugin list --verbose #列出插件,并按照关键词进行分组bin/plugin list --group output

最关键的步骤来了,现在我们要把实际使用的日志导入logstash中。

 

安装elasticsearch:

直接从www.elastic.co下载1.7.1版本。

 

参考文献:

《https://www.elastic.co/guide/en/logstash/current/index.html》  介绍logstash简单入门的文章。官方文档,简单易懂,作者也是通过阅读此文章做的笔记。