ELK实时日志分析平台的搭建部署及使用

一、ELK初步接触

1.1为什么要用ELK

日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。

通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。

集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。

·Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

·Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。

·Kibana也是一个开源和免费的工具,它Kibana可以为Logstash和ElasticSearch提供的日志分析友好的Web界面,可以帮助您汇总、分析和搜索重要数据日志。


ELK架构图

Elasticsearch下载地址:https://www.elastic.co/downloads/elasticsearch(目前最新版本:5.4.3)

Logstash下载地址:https://www.elastic.co/downloads/logstash(目前最新版本:5.4.3)

Kibana下载地址:https://www.elastic.co/downloads/kibana(目前最新版本:5.4.3)

1.2Java 8

elasticsearch推荐使用java8,所以先安装好java8。

1.3Elasticsearch

elasticsearch的安全机制不允许用root用户启动,故新建用户elk:elk。

以elk用户启动elasticsearch:

$ su - elk

$ elasticsearch-5.4.3/bin/elasticsearch &

安装结束后:curl localhost:9200返回如下内容表示安装成功。

{

"name" : "aQgGH94",

"cluster_name" :"elasticsearch",

"cluster_uuid" :"BjFsa-KxQdSnP58Enrr6NA",

"version" : {

"number" : "5.4.3",

"build_hash" :"eed30a8",

"build_date" :"2017-06-22T00:34:03.743Z",

"build_snapshot" : false,

"lucene_version" :"6.5.1"

},

"tagline" : "You Know, forSearch"

}

安装过程中可能会出现的问题及解决:http://blog.csdn.net/leehbing/article/details/74627134

1.4Kibana

修改配置文件kibana-5.4.3-linux-x86_64/config/kibana.yml:

# The Elasticsearch instance to use forall your queries.

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

执行:

$ su–elk

$ ./kibana

1.5Nginx

前面kibana只能采用localhost访问,这里利用反向代理使其他机器可以访问,本文利用nginx来达到这一目的。

修改配置文件nginx/nginx.conf:

将默认的server{}这一段去掉,添加:includeconf.d/*.conf;

$ vinginx/conf.d/kibana.conf

server {

listen 80;

server_name bogon;#机器的hostname

#auth_basic "Restricted Access";

#auth_basic_user_file /etc/nginx/htpasswd.users;

location / {

proxy_passhttp://localhost:5601;#范文kibana的地址

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection 'upgrade';

proxy_set_header Host $host;

proxy_cache_bypass $http_upgrade;

}

}

$./nginx/sbin/nginx#启动nginx

1.6Logstash


其实它就是一个收集器而已,我们需要为它指定Input和Output(当然Input和Output可以为多个)。

新建索引配置文件

$ cd logstash-5.4.3/bin

$ mkdir conf

$ vi conf/logstash-indexer.conf

input {

file {

path =>["/var/opt/log/a.log","/var/opt/log/b.log"]

}

}

output {

elasticsearch { hosts => ["localhost:9200"] }

stdout { codec => rubydebug }

}

上面几个步骤的意思就是创建一个名为logstash-indexer.conf的配置文件,input{file{...}}部分指定的是日志文件的位置(可以多个文件),一般来说就是应用程序log4j输出的日志文件。output部分则是表示将日志文件的内容保存到elasticsearch,这里hosts对应的是一个数组,可以设置多个elasticsearch主机,相当于一份日志文件的内容,可以保存到多个elasticsearch中。stdout,则表示终端的标准输出,方便部署时验证是否正常运行,验证通过后,可以去掉。

$ ./logstash -fconf/logstash-indexer.conf#启动logstash

稍等片刻,如果看到Logstash

startup completed,则表示启动成功。然后另开一个终端窗口,随便找个文本编辑工具(比如:vi),向/var/opt/log/a.log里写点东西,比如:hello world之类,然后保存。观察logstash的终端运行窗口,是否有东西输出,如果有以下类似输出:

{

"path" => "/var/opt/log/a.log",

"@timestamp" =>2017-07-09T03:17:28.001Z,

"@version" =>"1",

"host" => "bogon",

"message" =>"hello word"

}

在浏览器中输入http://192.168.1.139,即会跳转至kibana页面,首次运行,会提示创建index,直接点击Create按钮即可。


二、 应用场景示例

2.1收集多个服务器的日志

在客户服务器安装Filebeat,将日志发送给logstash。


图解

2.1.1生成SSL认证

因为要使用Filebeat将日志从客户端发送到ELK,所以需要创建SSL认证和秘钥对。Filebeat会使用该认证来识别ELK。有两种方法来生成SSL认证。如果已经有DNS设置,即可以使客户端识别ELK服务端的IP地址,使用第二种方法,否则使用第一种方法。

第一种方法:IP地址

如果没有DNS设置(DNS的设置可以让产生日志的客户端服务器来识别ELK服务器的IP地址),必须将ELK服务器的IP地址添加到SSL认证的subjectAltName(SAN)域中。

$ vi/etc/pki/tls/openssl.cnf#编辑OpenSSl的配置文件

找到[ v3_ca ]段,在其下加入subjectAltName

= IP: ELK_server_private_ip(ELK_server_private_ip为ELK的IP地址)

利用以下命令来生成SSL认证以及私钥

$ cd/etc/pki/tls#在/etc/pki/tls/目录下

$ openssl req -config /etc/pki/tls/openssl.cnf -x509 -days3650-batch -nodes -newkey rsa:2048-keyoutprivate/logstash-forwarder.key -out certs/logstash-forwarder.crt

生成的logstash-forwarder.crt文件将被拷贝到所有发送日志给logstash的服务器上。

第二种方法:FQDN(DNS)

直接利用以下命令来生成SSL认证以及私钥(在/etc/pki/tls/目录下)(ELK_server_fqdn:ELK服务器的FQDN)

$ cd /etc/pki/tls

$ openssl req -subj'/CN=ELK_server_fqdn/'-x509 -days3650-batch

-nodes -newkey rsa:2048-keyoutprivate/logstash-forwarder.key-out certs/logstash-forwarder.crt

2.1.2配置logstash

Logstash的配置文件采用json的格式,配置文件包括三个部分:inputs,filters,outputs。

$ vi bin/conf/02-beats-input.conf

input {

beats {

port => 5044

ssl => true

ssl_certificate =>"/etc/pki/tls/certs/logstash-forwarder.crt"

ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"

}

}

描述一个beats输入,监听tcp端口5044,并且会利用前面创建的ssl认证即秘钥

$ vi bin/conf/10-syslog-filter.conf

filter {

if[type] == "syslog" {

grok {

match => { "message" =>"%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname}%{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?:%{GREEDYDATA:syslog_message}" }

add_field => [ "received_at", "%{@timestamp}" ]

add_field => [ "received_from", "%{host}" ]

}

syslog_pri { }

date {

match => [ "syslog_timestamp", "MMMd HH:mm:ss", "MMM dd HH:mm:ss"]

}

}

}

对syslog类型(Filebeat进行标记)的日志进行过滤,并利用grok将输入的syslog日志解析

以使之结构化并且利于查询。

$ vi bin/conf/30-elasticsearch-output.conf

output {

elasticsearch {

hosts => ["localhost:9200"]

sniffing => true

manage_template => false

index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"

document_type => "%{[@metadata][type]}"

}

}

将beats数据存储到elasticsearch(localhost:9200)并设置了index和type

如果要为其他使用Filebeats输入的应用添加filter,请确保将这些文件正确命名,以使该文件的顺序位于input和output文件之间(比如在02-和30-之间)

2.1.3加载kibana仪表盘

elastic提供了一些kibana仪表盘和Beats索引模式的样例,虽然本文不会使用这些仪表盘,但是还是会加载这些仪表盘,因为我们可以使用它们包含的Filebeat索引模式。

下载仪表盘样例文件:

$ curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.1.0.zip

$ yum -y install unzip#安装unzip

$ unzip beats-dashboards-*.zip

$ cd beats-dashboards-*

$./load.sh#加载仪表盘样例

刚刚加载了如下索引模式:

[packetbeat-]YYYY.MM.DD

[topbeat-]YYYY.MM.DD

[filebeat-]YYYY.MM.DD

[winlogbeat-]YYYY.MM.DD

当使用kibana的时候,将选择Filebeat索引模式作为默认。

2.1.4加载Filebeat索引模板

因为打算使用FIlebeats来将日志送至elasticsearch,应该加载Filebeat索引模板。这个索引模板将会配置elasticsearch以机智的方式来分析送进来的Filebeat字段。

$ curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json#下载Filebeat索引模板$ curl -XPUT'http://localhost:9200/_template/filebeat?pretty'-d@filebeat-index-template.json#加载此模板

现在ELK服务器已经准备好接受Filebeat数据。

2.1.5在Client主机上安装FileBeat软件包

复制SSL认证

在ELK服务器上,拷贝之前创建的SSL证书到客户端服务器上。

$ scp/etc/pki/tls/certs/logstash-forwarder.crtuser@client_server_private_address:/tmp

在客户机上:

$ mkdir -p/etc/pki/tls/certs

$ cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/

安装Filebeat包

准备好filebeat-5.5.0-linux-x86_64.tar.gz

配置Filebeat

配置Filebeat来连接到Logstash

在客户服务器上:

$ vifilebeat/filebeat.yml

filebeat:

prospectors:#定义了哪些日志文件可以被传送给Logstash,并且该如何处理它们

-#表示开始定义prospector

paths:

- /var/log/secure#表示传送secure和messages日志

- /var/log/messages

#- /var/log/*.log

input_type: log

document_type: syslog #传送的日志类型为syslog,其也是Logstash过滤器配置的

registry_file: /var/lib/filebeat/registry

output:

logstash:

hosts: ["elk_server_private_ip:5044"]#ELK服务器的IP,发送至Loastash

bulk_max_size: 1024

tls:

# List of root certificates for HTTPS server verifications

certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]

shipper:

logging:

files:

rotateeverybytes: 10485760 # = 10MB

注意,Filebeat的配置文件是YAML格式的,所以空格数是很重要的。

现在Filebeat就会发送客户服务器上的syslog messages and secure文件到ELK服务器!其他的客户端服务器一样配置。

2.2 kibana案例数据

这里直接将数据导入elasticsearch,即假设数据源的数据已经存储到elasticsearch中,然后利用kibana来对数据进行可视化。

导入以下三种数据:

1.莎士比亚的所有著作,合适地解析成了各个字段:shakespeare.json。

2.随机生成的虚构账号数据:accounts.json

3.随机生成的日志文件:logs.jsonl

shakespear.json的数据格式如下:

{

"line_id": INT,

"play_name":"String",

"speech_number": INT,

"line_number":"String",

"speaker":"String",

"text_entry":"String",

}

accounts.json的数据格式如下:

{

"account_number": INT,

"balance": INT,

"firstname":"String",

"lastname":"String",

"age": INT,

"gender":"M or F",

"address":"String",

"employer":"String",

"email":"String",

"city":"String",

"state":"String"

}

logs.jsonl的主要数据格式如下:

{

"memory": INT,

"geo.coordinates":"geo_point"

"@timestamp":"date"

}

在kibana界面建立三个索引模式,分别对应刚刚导入es的索引:

logstash-2015.05*->logs.jsonl

bank*->account.json

shakes*->shakespear

然后利用kibana的visualize功能可定制如下图表展示:


账户落在不同薪水范围的比率,最外圈表示按薪水所有者的年龄拆分


每个剧台前幕后的数量


可视化一些地理数据

本文原创首发于Cobub官网博客,作者:李红兵

如有转载请注明作者和出处!

推荐一款开源 私有化部署的移动应用数据统计分析 系统Cobub Razor

开源社区技术交流QQ群:194022996

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容