需求背景
一位朋友的公司研发最近有一些苦恼。由于他们公司的后台服务有三台,每当后台服务运行异常,需要看日志排查错误的时候,都必须开启3个ssh端口进行查看,研发们觉得很不方便,于是便有了统一日志收集与查看的需求。
这里,我用ELK集群,通过收集三台后台服务的日志,再统一进行日志展示,实现了这一需求。
当然,当前只是进行了简单的日志采集,如果后期相对某些日志字段进行分析,则可以通过logstash以及Kibana来实现。
部署环境
系统:CentOS 7
软件:
elasticsearch-6.1.1
logstash-6.1.1
kibana-6.1.1
下载地址:https://www.elastic.co/cn/products
搭建步骤
一:elasticsearch:
elasticsearch是用于存储日志的数据库。
下载elasticsearch软件,解压:
# tar -zxvf elasticsearch-6.1.1.tar.gz # mv elasticsearch-6.1.1 /opt/apps/elasticsearch
由于elasticsearch建议使用非root用户启动,使用root启动会报错,故需创建一个普通用户,并进行一些简单配置:
# useradd elk # vi /opt/apps/elasticsearch/config/elasticsearch.yml network.host: 0.0.0.0 http.port: 9200 http.cors.enabled: true http.cors.allow-origin: "*"
启动,并验证:
# su - elk $ nohup /opt/apps/elasticsearch/bin/elasticsearch & # netstat -ntpl | grep 9200 tcp 0 0 0.0.0.0:9200 0.0.0.0:* LISTEN 6637/java #curl 'localhost:9200/_cat/health?v' epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent 1514858033 09:53:53 elasticsearch yellow 1 1 241 241 0 0 241 0 - 50.0%
二:logstash
logstash用于收集各服务器上的日志,然后把收集到的日志,存储进elasticsearch。收集日志的方式有很多种,例如结合redis或者filebeat,这里我们使用redis收集的方式。
安装logstash:
在所有服务器上: # tar -zxvf logstash-6.1.1.tar.gz # mv logstash-6.1.1 /opt/apps/logstash/
配置后台服务器,收集相关的日志:
在三台后台服务器上新建logstash文件,配置日志收集: # vi /opt/conf/logstash/logstash.conf input { file { #指定type type => "web_stderr" #匹配多行的日志 codec => multiline { pattern => "^[^0-9]" what => "previous" } #指定本地的日志路径 path => [ "/opt/logs/web-stderr.log"] sincedb_path => "/opt/logs/logstash/sincedb-access" } file { type => "web_stdout" codec => multiline { pattern => "^[^0-9]" what => "previous" } path => [ "/opt/logs/web-stdout.log"] sincedb_path => "/opt/logs/logstash/sincedb-access" } #收集nginx日志 file { type => "nginx" path => [ "/opt/logs/nginx/*.log"] sincedb_path => "/opt/logs/logstash/sincedb-access" } } output { #指定输出的目标redis redis { host => "xx.xx.xx.xx" port => "6379" data_type => "list" key => "logstash" } }
配置elk日志服务器上的logstash,从redis队列中读取日志,并存储到elasticsearch中:
# vi /opt/conf/logstash/logstash-server.conf #配置从redis队列中读取收集的日志 input { redis { host => "xx.xx.xx.xx" port => "6379" type => "redis-input" data_type => "list" key => "logstash" threads => 10 } } #把日志输出到elasticsearch中 output { elasticsearch { hosts => "localhost:9200" index => "logstash-%{type}.%{+YYYY.MM.dd}" } #这里把日志收集到本地文件 file { path => "/opt/logs/logstash/%{type}.%{+yyyy-MM-dd}" codec => line { format => "%{message}"} } }
启动logstash进程:
后台服务器: # nohup /opt/apps/logstash/bin/logstash -f /opt/conf/logstash/lmb.conf --path.data=/opt/data/logstash/lmb & elk日志服务器: # nohup /opt/apps/logstash/bin/logstash -f /opt/conf/logstash/logstash-server.conf --path.data=/opt/data/logstash/logstash-server &
三:kibana
kibana用于日志的前端展示。
安装、配置kibana:
# tar -zxvf kibana-6.1.1-linux-x86_64.tar.gz # mv kibana-6.1.1-linux-x86_64 /opt/apps/kibana 配置elasticsearch链接: # vi /opt/apps/kibana/config/kibana.yml server.port: 5601 server.host: "0.0.0.0" #配置elasticsearch链接: elasticsearch.url: "http://localhost:9200"
启动kibana:
nohup /opt/apps/kibana/bin/kibana &
访问kibana:
可以根据我们在logstash中配置的type,创建索引:
可以根据我们创建的索引,进行查看(这里查看nginx日志):
后记:
当然了,结合logstash和kibana不单单仅能实现收集日志的功能,通过对字段的匹配、筛选以及结合kibana的图标功能,能对我们想要的字段进行分析,实现相应的数据报表等。
ELK的功能十分强大,以后有机会,继续和大家探讨!!
原文地址:http://blog.51cto.com/icenycmh/2056539