标签:elk
ELK是对Elasticsearch、Logstash、Kibana整合平台的简称。在日常的运维工作中,要实时监控服务器的业务、系统和硬件状态,除了使用监控之外,还需要搜集大量的日志来进行分析。但是在面对海量的服务器和集群时,通过单台登录查询的方式显然是不可能的,对于不同时间段和集群日志的分析仅仅通过简单的脚本来统计也是难以实现。ELK日志平台通过日志搜集,查询检索和前端展示的方式帮我们实现了这样的功能。
Elasticsearch是个开源分布式搜索引擎,具有分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等特性。
Logstash是一个完全开源的工具,他可以对日志进行收集、分析,并将其存储.
Kibana 是一个开源和免费的工具,可以为 Logstash 和 ElasticSearch 提供的日志分析友的 Web 界面.
ELKStack 部署
Elasticsearch部署
Elasticsearch 需要安装java环境,首先需要安装JDK.
[root@node1]# yum intall -y java [root@node1]# java -version openjdk version "1.8.0_111" OpenJDK Runtime Environment (build 1.8.0_111-b15) OpenJDK 64-Bit Server VM (build 25.111-b15, mixed mode)
在安装Elasticsearch前需要先下载安装PGP key:
[root@node1 ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
添加yum仓库:
[root@node1 ~]# vim /etc/yum.repos.d/elasticsearch.repo [elasticsearch-2.x] name=Elasticsearch repository for 2.x packages baseurl=http://packages.elastic.co/elasticsearch/2.x/centos gpgcheck=1 gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch enabled=1
yum 安装Elasticsearch:
yum install -y elasticsearch
LogStash部署
和Elasticsearch一样,在开始部署LogStash之前也需要你的环境中正确的安装的JDK。可以下载安装Oracle的JDK或者使用 yum安装openjdk.这里部署node2上。同样的,如果是在不同的机器上安装Logstash,需要再次下载安装PGP key:
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
添加YUM仓库:
[root@node2 ~]# vim /etc/yum.repos.d/logstash.repo [logstash-2.3] name=Logstash repository for 2.3.x packages baseurl=https://packages.elastic.co/logstash/2.3/centos gpgcheck=1 gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch enabled=1
安装Logstash:
[root@node2 ~]# yum install -y logstash
Kibana部署
如果是在不同的机器上部署Kibana,需要安装PGP key.这里部署在node1上,所以不必再次安装。
添加yum仓库:
[root@node1 ~]# vim /etc/yum.repos.d/kibana.repo [kibana-4.5] name=Kibana repository for 4.5.x packages baseurl=http://packages.elastic.co/kibana/4.5/centos gpgcheck=1 gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch enabled=1
安装Kibana:
[root@node1 ~]# yum install -y kibana
在实际的生产环境,可以创建本地的YUM仓库,使用Cobbler来创建自己的YUM仓库:
[root@log-node1 ~]# cobbler repo add --name=logstash-2.3 --mirror=http://packages.elastic.co/logstash/2.3/centos --arch=x86_64 --breed=yum [root@log-node1 ~]# cobbler repo add --name=elasticsearch2 --mirror=http://packages.elastic.co/elasticsearch/2.x/centos --arch=x86_64 --breed=yum [root@log-node1 ~]# cobbler repo add --name=kibana4.5 --mirror=http://packages.elastic.co/kibana/4.5/centos --arch=x86_64 --breed=yum [root@log-node1 ~]# cobbler reposync
配置Elasticsearch
修改elasticsearch的配置文件:
[root@node1 ~]# cd /etc/elasticsearch/ [root@node1 elasticsearch]# grep "^[a-Z]" elasticsearch.yml cluster.name: myes #自定义cluster名称 node.name: node1 #本地节点主机名 path.data: /data/es-data #数据路径,如果是自定义的,需要修改目录权限elasticsearch path.logs: /var/log/elasticsearch #日志路径 bootstrap.memory_lock: true #禁止使用swap,提升性能 network.host: 172.16.10.20 #本地主机名 http.port: 9200 #监听的端口
修改数据目录的权限,并启动:
chown -R elasticsearch.elasticsearch /data/es-data systemctl start elasticsearch
验证是否启动:
[root@node1 elasticsearch]# curl 172.16.10.20:9200 { "name" : "node1", "cluster_name" : "myes", "cluster_uuid" : "0lJjtxjBRfeMO9WY8bl3-Q", "version" : { "number" : "2.4.3", "build_hash" : "d38a34e7b75af4e17ead16f156feffa432b22be3", "build_timestamp" : "2016-12-07T16:28:56Z", "build_snapshot" : false, "lucene_version" : "5.5.2" }, "tagline" : "You Know, for Search" }
[root@node1 elasticsearch]# curl -i -XGET ‘http://172.16.10.20:9200/_count?‘ HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 Content-Length: 59 {"count":0,"_shards":{"total":0,"successful":0,"failed":0}}
安装head:
[root@node1 ~]# /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head
可以直接在网页使用head:
安装kopf:
/usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf
在网页上可直接使用此插件:
安装这类插件可以在github主页直接搜索,然后使用plugin install 路径 即可。
添加Elasticsearch集群
当使用head访问Elasticsearch时,由于只有一个主分片,所以显示的yellow的状态,为了保证可靠性,我们需要再添加一个副分片。
同理,在node2上也安装上Elasticsearch,配置文件修改为本地的参数,同时,配置单播参数,自动发现node2,只需在node2上配置单播即可。
[root@node2 elasticsearch]# grep "^[a-Z]" elasticsearch.yml cluster.name: myes node.name: node2 path.data: /data/es-data path.logs: /var/log/elasticsearch bootstrap.memory_lock: true network.host: 172.16.10.21 http.port: 9200 discovery.zen.ping.unicast.hosts: ["172.16.10.20", "172.16.10.21"]
重新启动node2上的Elasticsearch,在node1上使用head登录,此时,发现node2已经加入进来:
带的为master 节点,主节点会展示当前的状态。
Elasticsearch的健康检查
https://www.elastic.co/guide/en/elasticsearch/guide/current/_cluster_health.html
Elasticsearch提供了自身用于健康检查的API,会返回一组JSON的数据:
# curl -XGET http://172.16.10.20:9200/_cluster/health # curl -XGET http://172.16.10.20:9200/_cluster/health?pretty=true { "cluster_name" : "myes", "status" : "green", "timed_out" : false, "number_of_nodes" : 2, "number_of_data_nodes" : 2, "active_primary_shards" : 11, "active_shards" : 22, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 }
同时,官方还提供了多样监控信息,可以通过cat API的方式来返回需要的数据:
https://www.elastic.co/guide/en/elasticsearch/guide/current/_cat_api.html
# curl -XGET http://172.16.10.20:9200/_cat/health 1482981911 11:25:11 myes green 2 2 22 11 0 0 0 0 - 100.0%
对集群中的任意一个节点去查询,此节点都会从搜集到整个集群的信息进行返回:
# curl -XGET http://172.16.10.20:9200/_cat/nodes?v host ip heap.percent ram.percent load node.role master name 172.16.10.20 172.16.10.20 5 93 0.83 d * node1 172.16.10.21 172.16.10.21 3 74 0.03 d m node2
# curl -XGET http://172.16.10.21:9200/_cat/nodes?v host ip heap.percent ram.percent load node.role master name 172.16.10.20 172.16.10.20 5 93 0.92 d * node1 172.16.10.21 172.16.10.21 3 74 0.01 d m node2
Elasticsearch有green
/yellow
/red
三种不同的状态级别,green 表示所有节点分片正常,yellow 表示主节点分片正常,副本节点分片存在故障或丢失,red 表示主节点分片丢失,在搜索时只能返回部分结果。
提示: 在生产环境部署前,需要调整文件描述符数量和maximum map count 数量,否则, 在修改之后需要重启Elasticsearch。
如: sysctl -w vm.max_map_count=262144
Logstash日志搜集
Logstash可以使用多种方式处理数据。其中常用的是使用INPUT,OUTPUT,FILTER等功能对数据进行搜集和处理。可以使用TCP,file, rsyslog等方式来搜集不同的日志。
简单示例:
# /opt/logstash/bin/logstash -e ‘input { stdin{} } output { stdout{} }‘ Settings: Default pipeline workers: 1 Pipeline main started hello 2016-12-29T04:00:39.937Z node2 hello
指定格式输出:
# /opt/logstash/bin/logstash -e ‘input { stdin{} } output { stdout{ codec => rubydebug} }‘ Pipeline main started errttt { "message" => "errttt", "@version" => "1", "@timestamp" => "2016-12-29T07:24:41.016Z", "host" => "node2" }
Logstash使用插件将数据输入输出到不同的对象。
使用elasticsearch插件,output到Elasticsearch中:
https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html
手动测试:
# /opt/logstash/bin/logstash -e ‘input { stdin{} } output { elasticsearch { hosts => ["172.16.10.20:9200"] index => "logstash-%{+YYYY.MM.dd}" } }‘ Settings: Default pipeline workers: 1 Pipeline main started rrrrr ooooooooooooo
在web界面显示收取的信息:
Logstash-Input-file
在实际的生产环境中,如果要使用Logstash来搜集文件需要在每台主机上安装Logstash,因为只有使用logstash才能读取本地的INPUT file,当然,也可以通过网络和其他方式将文件内容发送给Logstash.
按照上面手动执行的方式实现是不现实的,通常会编辑一个配置文件,在启动logstash的时候指定此配置文件,就可以将文件输出记录到系统中。
# vim /etc/logstash/conf.d/demo.conf # 默认文件的存放目录,可以在logstash的启动脚本中更改 input{ stdin{} # input 插件 } filter{ # filter可以没有,可以为空 } output{ elasticsearch { hosts => ["172.16.10.21:9200"] # output中的插件 => 表示等于,[]表示数组,此处可以加多个IP index => "logstash-%{+YYYY.MM.dd}" # output中的index插件 } stdout{ codec => rubydebug } }
启动logstash,并使用 -f 指定文件:
# /opt/logstash/bin/logstash -f /etc/logstash/conf.d/demo.conf Settings: Default pipeline workers: 1 Pipeline main started test1 #手动输入 { "message" => "test1", "@version" => "1", "@timestamp" => "2016-12-29T07:55:12.738Z", "host" => "node2" }
这样在Elastic上就可以看到需要展示的数据。
使用Logstash搜集本地日志文件,并output到Elasticsearch
在node2主机上编辑Logstash的配置文件:
# cat /etc/logstash/conf.d/file.conf input{ file { path => ["/var/log/messages","/var/log/secure"] type => "system-log" start_position => "beginning" } } filter{} output{ elasticsearch { hosts => ["172.16.10.20:9200"] index => "system-log-%{+YYYY-MM}" } }
启动Logstash:
# /opt/logstash/bin/logstash -f /etc/logstash/conf.d/file.conf
启动之后如下图:
上面的启动方式是前台启动,也可以使用系统默认的后台启动方式 :
/etc/init.d/logstash start
Logstash if条件判断
在需要搜集多种日志到不同的index中时,需要使用If条件判断的方式,将对应的不同日志,放到不同的索引中,如:
[root@node2 ~]# cat /etc/logstash/conf.d/file.conf input{ file { path => ["/var/log/messages","/var/log/secure"] type => "system-log" # 指定TYPE,被监控的文件不能有type字段 start_position => "beginning" } file { path => "/var/log/nginx/access.log" type => "nginx-log" start_position => "beginning" } } filter { } output { if [type] == "system-log" { # 根据type判断写入哪个index elasticsearch { hosts => ["172.16.10.20:9200"] index => "system-log-%{+YYYY-MM}" } } if [type] == "nginx-log" { elasticsearch { hosts => ["172.16.10.20:9200"] index => "nginx-log-%{+YYYY-MM}" } } }
Logstash 正则匹配多行日志
在搜集日志的时候,默认是以事件的形式来逐条收集,但是如果同一事件日志内容有多行,如java日志,依旧使用默认的逐条收集的话,会造成日志格式支离破碎难以阅读,所以根据日志每段开始或者结尾的规律进行正则匹配,来收集日志也是非常重要的。
input { stdin { codec => multiline{ # 在INPUT区域加入这四行,表示匹配以“[” 头的 pattern => "^\[" # 日志内容为一个整体,进行记录 negate => true what => "previous" } } } filter{ } output{ stdout{ codec => rubydebug } }
上面的匹配规则为:当遇到当前行以“[” 开头时,就重新生成一行内容,这样在Kibana上展示的日志就和本地日志格式相同了。
Logstash格式化收集Nginx日志
在收集nginx访问日志时,由于要对整个日志做分析,所以对日志的字段进行拆分的方式可以更加便捷的搜索和统计,nginx 支持将日志以JSON的格式打印出来进行处理,在Kibana上展示时就将各个字段以类似表格的形式展现出来。
修改nginx配置文件,以JSON格式对输出日志:
log_format access_log_json ‘{"user_ip":"$http_x_real_ip","lan_ip": "$remote_addr","log_time":"$time_iso8601","user_req":"$request", "http_code":"$status","body_bytes_sent":"$body_bytes_sent","req_time": "$request_time","user_ua":"$http_user_agent"}‘;
access_log /var/log/nginx/access.log access_log_json;
编写logstash的配置文件,当有多项配置时,需要使用指定type,用if 语句去执行不同的动作,对日志指定json格式:
vim /etc/logstash/conf.d/file.conf
input{ file { path => ["/var/log/messages","/var/log/secure"] type => "system-log" start_position => "beginning" } file { path => "/var/log/nginx/access.log" type => "nginx-access-log" codec => "json" # 指定json格式 } } filter { } output { if [type] == "system-log" { elasticsearch { hosts => ["172.16.10.20:9200"] index => "system-log-%{+YYYY-MM}" } } if [type] == "nginx-access-log" { elasticsearch { hosts => ["172.16.10.21:9200"] index => "nginx-access-log-%{+YYYY-MM-dd}" } } }
测试文件是否有语法错误:
/opt/logstash/bin/logstash -t -f /etc/logstash/conf.d/file.conf Configuration OK
指定文件启动:
/opt/logstash/bin/logstash -f /etc/logstash/conf.d/file.conf
如果在Elasticsearch没有显示新的index,可以删除旧的.sincedb文件,重启logstash. 默认情况下.sincedb的文件是存放在/var/lib/logstash/,如果是指定文件启动的情况也可能会存放在家目录。
在后台启动时,会自动去读取/etc/logstash/conf.d目录下的配置文件:
/etc/init.d/logstash start
Kibana前端展示
Kibana是用于Elasticsearch前端友好展示和搜索功能的界面,只需要配置和Elasticsearch相关联即可。
Kibana配置:
[root@node1 ~]# vim /opt/kibana/config/kibana.yml [root@node1 ~]# grep "^[a-Z]" /opt/kibana/config/kibana.yml server.port: 5601 server.host: "0.0.0.0" elasticsearch.url: " # Elasticsearch的主机地址 kibana.index: ".kibana"
启动Kibana:
[root@node1 ~]# /etc/init.d/kibana start kibana started
登录Kibana WEB界面,创建一个system-log的index,Kibana会自动匹配上当前已存在的INDEICES(事件):
添加完之后,就可以在主界面查看当前index的日志信息了,提供了各种筛选日志的方式:
本文出自 “Trying” 博客,请务必保留此出处http://tryingstuff.blog.51cto.com/4603492/1887647
标签:elk
原文地址:http://tryingstuff.blog.51cto.com/4603492/1887647