ELK安装配置步骤

 

在业内常见的部署组合就是ELK系统了,ELK是elasticsearch、logstash、kibana三个系统的首字母组合。接下来的几篇博客会从整体和三个系统细分角度看ELK如何使用。

使用场景

说道日志,一般有这么几类:异常日志、请求日志、操作日志。

异常日志是大家写代码时经常看到的日志堆栈,这类日志有很多行,详细列出了异常信息、异常名称、出错的代码调用栈、内部异常原因(Caused by),是一类多行日志。

请求日志是接口的调用日志,常见的是nginx、tomcat、weblogic等负载均衡和web容器的日志,一行里面包含了访问时间、访问路径、状态码、结果大小、响应时间等信息。也有一些自定义的信息,比如SLA统计系统或者一些性能监控系统所需的日志信息,一般来说会包含请求编号、访问路径、步骤编号、响应时间等自定义的信息。

操作日志一般是用来审计或者结果追踪的信息,这类信息一般会专门的做统一存储,这类日志也比较重要,一般用数据库专门存储。

在ELK使用的场景中,多见的是对异常日志和请求日志的统一处理。

然而,由于请求日志一般来说生成的速度比较快。是至少相当于系统访问量,通常大于访问量,因为日志记录大多还会记录系统下游接口的访问日志,缓存访问日志等。因此,对于请求日志放到ELK的可能也不是特别多见,而是通过脚本针对特定的需求进行收集和查询。

部署方式

ELK部署最简单的方式就是L-E-K方式,不添加任何其他辅助系统,部署简单快速,容易上手。

这里写图片描述

第二种方式是在L-E之间添加一层redis辅助,这样能够减少日志在服务端的积压,把压力转移到ELK系统服务器上。这种方式添加redis之后,由于redis是内存系统所以响应速度很快,而且可以在redis后添加多个消费系统(Logstash),来扩展消费能力,增强处理速度。

这里写图片描述

接下来简单说一下E-L-K的三个组成部分。

Logstash

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

支持的输入类型很多,当前包括以下这些:

输出类型包括这些:

logstash在ELK组合里面担当的是数据收集和解析的功能。

elasticsearch

es的独立性也很强,它本身是一个分布式的搜索引擎,通过倒排序索引对存储的数据进行索引。

当输入查询关键字之后,es依据命中结果的匹配度有序返回结果,效果就像大家百度或者google搜索一样。

在ELK组合中,担当的是数据存储、索引和提供查询接口的功能。

kibana

kibana是一个数据展示的客户端,提供对es中数据的可视化搜索和展示功能,主要提供了时间维度和数据中字段值的检索。以及功能丰富的看板,能够添加曲线图、饼图、地址分布图等多种样式的展示图形。

在开始之前先说一下Logstash的使用和熟悉路线图。接触ELK的时候不能图快,可以尝试着一部分一部分的安装起来熟悉,之后再逐个组装到一起,看效果。

Logstash的独立性很高,熟悉路线可以按照这样来:

1.最基本的就是接收控制台输入,然后解析输出到控制台。 
2.从文件读入,解析输出到控制台。 
3.从文件读入,解析输出到elasticsearch。 
4.实际应用中需要打通的关节。

接下来一起看一下Logstash,这个系列使用的版本(Logstash5.3.0)下载地址是:https://www.elastic.co/cn/downloads

安装

1.安装JDK 1.8.0_65 
2.下载logstash5.3.0 
3.解压logstash

控制台—》控制台

1.在…/logstash-5.3.0/bin/目录中新建一个文件std_std.conf文件 
2.录入如下内容:

input {
    stdin{
    }
} 

output {
    stdout{
    }
}

3.在bin目录执行命令:./logstash -f std_std.conf 
4.稍等片刻,看到如下信息,说明启动完成了:

5.输入hello logstash!!!!,logash会在控制台回写出来这条信息:

文件—-》控制台

这里使用的文件是tomcat输出的access日志文件,很常见,内容如下:

111.206.36.140 - - [10/Aug/2016:23:16:29 +0800] "GET /nggirl-web/web/admin/work/special/listSelectedWork/v1.4.0?workIds=780 HTTP/1.1" 200 78 "http://www.baidu.com/s?wd=www" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"
111.206.36.140 - - [10/Aug/2016:23:16:29 +0800] "GET /nggirl-web/web/admin/work/special/listSelectedWork/v1.4.0?workIds=780 HTTP/1.1" 200 78 "http://www.baidu.com/s?wd=www" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"

1.在bin目录新建file_std.conf文件; 
2.内容如下:

input{
    file{
        path =>"/Develop/Tools/apache-tomcat-8.0.30/webapps/nggirllog/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{
    stdout{
        codec=>rubydebug
    }

3.然后运行./logstash -f file_std.conf,就会看到文件中原有的内容被逐条的显示在命令行了。

这个配置文件相对比较复杂,而且我们一般在使用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解析后的信息。你可以试着去掉这一句就明白他的用处了。

解析成功后会看到控制台中类似如下的内容:

文件到elasticsearch

1.在bin目录新建file_es.conf文件 
2.录入如下内容,和上一个例子的区别仅在于out部分:

input{
    file{
        path =>"/Develop/Tools/apache-tomcat-8.0.30/webapps/nggirllog/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 => "127.0.0.1"
        }
        stdout { codec => rubydebug}
}

3.执行./logstash -f file_es.conf

由于我们还没有开始部署elasticsearch,暂时不贴出效果,效果图将在下一个博客里面看到。

多行日志的处理

通过上面3步的熟悉,我们大概清楚了logstash的工作过程:

1.input读取指定文件里面的文本行,这里是一行一行读取的; 
2.然后filter对读入的每一行进行解析,拆分成一组一组的key-value值; 
3.out将解析后的结果输出写入到指定的系统。

但是,我们知道异常日志是一个多行文本,我们需要把多行信息输出到一行里面去处理,那么怎么办呢?

如果仍然按照单行文本的类似处理方式的话,我们需要在input部分添加配置项,如下:

input {
    stdin {
        codec => multiline {
            pattern => "^\["
            negate => true
            what => "previous"
        }
    }
}

这个配置是对每一个以”[“开头的行认作一个数据行的开始,后续不是以”[“开头的行都会认为是同一个数据的内容,当再次遇到”[“时结束这一个数据内容的读取,开始下一行。

这里有一个问题是,最后一个异常日志不能输出,因为logstash一直在等待下一个”[“的出现,但是一直没有出现,那么就不会输出了。

我们采用的处理多行文本的方式是自己实现了一个LogAppender,直接由程序日志类库以json串的形式输出到redis中,然后再由logstash读取。架构方式上属于第一篇中写的第二种架构方式。

以下是一些关键部分的代码片段:

 

 

 

紧接上一篇,这一篇我们开始安装es,这里使用的是es5.3.0版本,可以在官网下载:https://www.elastic.co/cn/downloads

5.0以后的版本和之前的版本在安装head插件上有一些区别,之前的版本安装head插件很容易,只需要运行

elasticsearch/bin/plugin -install mobz/elasticsearch-head

就可以了,但是5.0之后,head插件换成了采用grunt服务方式启动,需要用npm方式打包安装,稍微复杂一些。

接下来,一块看下es和head的安装。

安装elasticsearch

1.下载elasticsearch; 
2.解压缩; 
3.修改/elasticsearch-5.3.0/config/elasticsearch.yml 
打开:

 

network.host: 127.0.0.1
http.port: 9200

增加:

http.cors.allow-origin: "/.*/"
http.cors.enabled: true

这两个配置是支持跨域访问用的,这样的话后续安装的head插件和kibana才能够正常的访问es的查询接口。

现在网上的教程大多是老版本的安装说明,所以有可能你会遇到有些配置项不能使用的情况,如果遇到了只需要按照es启动时的提示信息或去掉或修改即可。

4.启动es服务

/elasticsearch-5.3.0/bin/elasticsearch -d #表示以daemon的方式启动,命令行输入输出不被占用

5.可以通过es的http接口进行es的测试,也可以等下一步的head插件安装完成之后在head里进行测试。

1.安装nodejs 
2.安装grunt-cli 
3.下载安装head插件

这里只是给出了简单的步骤,具体的安装过程请参见以下博客:http://www.cnblogs.com/xiaofei1205/p/6704239.html作者讲的比较详细,这里不进行重复。

其中有一点不同的地方是,在安装的过程中遇到了和以上作者不同的异常,是“”license”: “Apache2””的异常,提示需要修改成BSD授权。

修改方法参见这一篇博客:http://blog.csdn.net/u010504064/article/details/53312093

这里给出一个head的截图:

这是这个小系列的最后一篇了,我们将看到如何安装kibana,以及对ELK中的日志信息进行快速查询。

kibana安装

1.到官网下载kibana; 
2.解压缩; 
3.修改配置文件kibana-5.3.0-darwin-x86_64/config/kibana.yml 
打开:

elasticsearch.url: "http://localhost:9200"

这是链接es的http地址,kibana自身服务器默认的端口是5601. 
4.控制台中运行./kibana,运行成功会看到如下信息:

查看日志内容

首次访问的时候,需要添加一个index pattern,用来告诉kibana我们需要从es里面搜索哪些类型的索引。

 

里面的index name or pattern不用改,因为logstash默认在es里创建的索引就是logstash-*格式命名的。

Time-field name选择 @timestamp,然后点击创建。然后就会看到kibana把es里面对应索引的所有字段信息都获取过来了:

 

 

时间过滤器使用

要检索数据,我们需要进入到Discover标签页面,先来熟悉时间过滤器,在页面的右上角,点击一下就可以展开选择区了。用来选择一个时间范围内的数据。

这里提供了三种设置方式: 
1.快速的:可以快速的选择一个到当前时间为止N天,N月,N年的时间段; 
2.相对于现在的时间:可以更加细致的设置第一种方式中的N值; 
3.时间范围:可以明确指定开始时间和结束时间。

选中一个时间段后,可以看到搜索的结果分布和前500个结果的结果列表,以及左侧的字段列表、字段值top5.

添加快速显示字段

在左侧的字段列表中,鼠标滑动到某一个字段,字段右侧会出现一个add按钮,就是用来添加快速显示字段的。

快速显示字段是哪里呢,就是页面右侧的日志信息列表,因为日志信息包含的字段很多,默认只显示了time和_source两个字段,如果我们想快速显示path字段怎么办?就需要用到添加快速显示字段的功能了。


关键字包含匹配

有时候我们会看到日志中有很多接口的访问日志,如果我想看某一个特定接口的访问日志怎么办呢?

仍然需要在左侧的字段列表里操作,首先点击某个字段,比如来源于哪个日志文件(path),会看到列出的top5接口,而且每个接口旁边有一个放大镜和放小镜。放大镜就是用来增加包含匹配的,点击之后仅显示该字段值的日志。

关键字不包含匹配

字段列表处的放小镜就是用来设定不包含某个值了,比如我们只能看到top5,但是前几项我不关心,那么我们就可以把他排除掉,让更多的日志在top5能被看到,就需要这个功能了。

备注:大家可能很多接触es的人或者mongodb的让你都记得前段时间的比特币勒索,很多es和mongodb由于没有设置密码,库中的数据都被删除了。遗憾的是我们外网的一个es也被清洗了。所以如果自己的ELK是公网可以访问的那么最好给es设定一个用户名密码,让数据更安全一些。

一般来说日志信息我们只需要一段时间以内的,为了节省空间和服务器,可能会定期的删除一部分比较老的日志文件,比如一个月之前的。我们自己这边设定的是删除两周之前的。

这里给出一个示例,不是我们用的,公司用的是运维搭建的环境。这里示例来源是:http://www.iyunv.com/thread-259586-1-1.html

清理日志脚本

新建文件es-index-clear.sh,写入如下脚本内容

#/bin/bash
#es-index-clear
#获取上个月份日期
LAST_DATA=`date -d "last month"+%Y-%m`
#删除上个月份所有的索引
curl -XDELETE'http://127.0.0.1:9200/logstash-'${LAST_DATA}'-*'

添加定时任务

执行crontab -e增加如下定时任务:

0 1 5 * * /script/es-index-clear.sh

意思是每月5日1点清理一个月前的日志数据。

posted on 2018-01-29 18:33  透过代码看世界  阅读(2349)  评论(0编辑  收藏  举报

导航