背景
日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
解决方案
开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。官方网站:https://www.elastic.co/products
Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash是一个完全开源的工具,他可以对你的日志进行收集、分析,并将其存储供以后使用(如,搜索)。
kibana 也是一个开源和免费的工具,他Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。
实现原理
系统搭建
系统环境
JDK 1.8.0_74、elasticsearch-6.2.4、kibana-6.2.4-linux-x86_64、logstash-6.2.4、Linux version 2.6.32-431.23.3.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) )
搭建过程
1,安装JDK(省略)
2,安装ES(需要新建用户组和用户,ES不支持在root用户下操作)。
1) 解压ES
tar-zxvfelasticsearch-6.2.4.tar.gz
解压后目录结构如下:
2)修改ES的配置文件:vi config/elasticsearch.yml
注:network.host:0.0.0.0指明所有人都可以访问,上线后注意改成指定的IP地址
3)启动ES:./bin/elasticsearch -d (参数-d已后台任务的方式启动ES)
4)curl命令或者是浏览器访问看到如下界面说明ES启动成功。
3,安装logstash
1)解压logstash:tar-zxvf
解压后文件目录
2)在config文件下新建一个新的配置文件log_file_to_es.conf内容如下:
input:指定日志的来源。这里指定的是业务日志文件。start_position:指定从文件的开头开始导入数据。logstash的input支持多种数据源来收集日志:官方文档:https://www.elastic.co/guide/en/logstash/current/input-plugins.html
filter:指定日志的过滤规则,这里未指定。filter支持的插件和过滤规则:https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
output:指定日志输出的位置。这里指定日志输出到ES。host:ES的服务器地址。index:ES的索引名称。output能够将日志输出到多个指定的位置:https://www.elastic.co/guide/en/logstash/current/output-plugins.html
3)启动logstash:nohup ./logstash -f log_file_to_es.conf &
-f参数指定用你新建的配置文档启动logstash。
nohup命令指定已后台任务的方式启动logstash
4,安装kibana
1)解压kibana:tar-zxvf
解压后目录
2)修改配置文件:vi /config/kibana.yml
serve.host:指定kibana的服务器
elasticsearch.url:指定ES的服务器地址
3)已后台任务的方式启动kibana:nohup ./kibana &
4)浏览器访问:IP:5601 界面如下
遇到的坑和遇到的问题
1,ELK的版本变化比较快。目前官网的最新版本是6.2.4。而看到的很多文章还都是ELK5+甚至是2+。不同的版本导致一些配置项的不同造成了很大的不同。
例如ES 2+版本支持已在线直接安装head插件。执行命令即可(./bin/plugininstallmobz/elasticsearch-head)。但是在6+的版本中已经禁止了这种方式,只能通过离线上传插件,通过node.js和grunt安装。参考地址:https://blog.csdn.net/zoubf/article/details/79007908。
在比如很多时候我们都希望直接把业务日志直接出入到ES中,在logstash中input为log4j即可(logstash默认不支持log4j,需要安装插件:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html)。但是我试的时候及时安装了也配置了但是还没有起作用,又去查看官方文档,这时候发信啊原来这种方式已经被官方建议去掉了,不知道是不是这个原因导致的。
总结在安装ELK的时候一定要注意不同的版本可能会给搭建带来不一样的问题。
2,一些报错和相应的解决方案
问题一:警告提示
[2016-11-06T16:27:21,712][WARN ][o.e.b.JNANatives ] unable to install syscall filter:
java.lang.UnsupportedOperationException: seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER compiled in
at org.elasticsearch.bootstrap.Seccomp.linuxImpl(Seccomp.java:349) ~[elasticsearch-5.3.0.jar:5.3.0]
at org.elasticsearch.bootstrap.Seccomp.init(Seccomp.java:630) ~[elasticsearch-5.3.0.jar:5.3.0]
报了一大串错误,其实只是一个警告。
解决:使用心得linux版本,就不会出现此类问题了。
问题二:ERROR: bootstrap checks failed
max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
max number of threads [1024] for user [lishang] likely too low, increase to at least [2048]
解决:切换到root用户,编辑limits.conf 添加类似如下内容
vi /etc/security/limits.conf
添加如下内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
原因:
这是在因为Centos6不支持SecComp,而ES5.2.0默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动。
解决:
在elasticsearch.yml中配置bootstrap.system_call_filter为false,注意要在Memory下面:
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
问题三:max number of threads [1024] for user [lish] likely too low, increase to at least [2048]
解决:切换到root用户,进入limits.d目录下修改配置文件。
vi /etc/security/limits.d/90-nproc.conf
修改如下内容:
* soft nproc 1024
#修改为
* soft nproc 2048
问题四:max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
解决:切换到root用户修改配置sysctl.conf
vi /etc/sysctl.conf
添加下面配置:
vm.max_map_count=655360
并执行命令:
sysctl -p
然后,重新启动elasticsearch,即可启动成功。