本文来自网易云社区

作者:王贝

为什么推荐ELK:

当线上服务器出了问题,我们要做的最重要的事情是什么?当需要实时监控跟踪服务器的健康情况,我们又要拿什么去分析?大家一定会说,去看日志,去分析日志。是的,日志对于服务器开发人员来讲是最亲密的伙伴了,基本上每天都会去看各种类型的海量的日志去定位问题,去做统计分析等等。最常见的查看日志的情况,比如线上出了bug,我们ssh到线上服务器,cd到服务器的日志目录,然后less一下当天的日志文件,执行shift+G,?error,n,一系列操作之后找到对应的异常情况,查出异常原因。可是,这样好low啊,效率好低啊,为什么呢?首先,我们要登录到服务器,线上基本上都是服务器集群,少则十几台,多则上百台,光这一台一台的服务器去登录就是一个巨大而又繁琐的工作,其次,我们有时还要各种聚合(比如对比多台机器同一时间点的日志),或者基于异常多个关键词的搜索,并有且,或,交,并,差,补,排序等一些操作,而且相应速度必须给力,那这个时候无论怎么grep awk估计都无济于事了。面对服务集群,面对海量日志,没有一个集中化可视化的日志管理,程序猿GG估计真的要跪了。为了解放众多webserver程序猿,为了解放生产力提高效率,为了更精准实时的查看分析线上日志,业界放了一个大招:用强强联手的ELK日志分析平台实现集中化可视化日志管理。如果线上环境出了故障,能够立刻准确定位,ELK就是高手,在百万大军中取上将首级,犹如探囊取物,所以这时候ELK就非常适合了,当然除此之外,ELK也经常在运维工作中大放光彩,在应用级别的实时监控,非常适合一些重要核心服务的预警。

先简单上两个例子显示一下ELK的强大:

(1)根据过滤规则,生成24小时内所有服务器的ERROR比例饼状图,监控服务器的健康程度。(目前GACHA项目7台server接入了ELK平台正在试用,这张图是这七台server过去24小时的异常比例)

(2)生成24小时内每个时间范围内的异常数量柱状图,点击柱状图下面可以看到具体异常堆栈情况(柱状图统计的是GACHA项目服务器集群过去24小时每个时间段的异常数量,柱状图下面是异常列表,第一张图左侧可以选择添加异常列表展示项,第二张图就是选择了展示host,priority,stack trace,message这些项的结果,第三张图是点击可以看到的具体异常堆栈详情)。

好了,看到这些,是不是心略有所动呢,其实ELK的强大还远不止于此呢,打个鸡血继续往下看吧。

ELK简介:

ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。官方网站:   https://www.elastic.co/products

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

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

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

由此可以看到,ELK组合其实可以看成一个MVC模型,logstash接收应用服务器的日志传输请求收集日志,相当于控制层controller,ElasticSearch用于数据源存储,搜索等,相当于Model,而Kibana提供友好的 Web 界面,相当于View。

ELK 搭建:

接下来,我走一下ELK整个搭建流程:

第一步:搭建ElasticSearch

(1)首先下载ElasticSearch(先安装jdk1.7,整个就不细说了),这里我用的是Elasticsearch 2.4.1版本:

wget   https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.4.1/elasticsearch-2.4.1.tar.gz

(2)解压:

tar -zxvf elasticsearch-2.4.1.tar.gz

(3)配置:

cd elasticsearch-2.4.1

vim config/elasticsearch.yml

#ES的集群名称

cluster.name : es_cluster

#当前该节点名

node.name : node0

#当前节点是否允许被选举为master节点

#node.master: true

#当前节点是否允许存储数据

node.data: true

#索引分片个数

index.number_of_shards: 5

#索引副本个数

index.number_of_replicas: 1

#索引数据存储路径,

path.data : /home/hzwangbei/elasticsearch/data

path.logs : /tmp/elasticsearch/logs

#读取配置文件路径,默认ES根目录config路径

#path.conf: /path/to/conf

#ES插件存储路径,默认ES根目录plugins路径

#path.plugins: /path/to/plugins

#当前hostname或IP,这是ES用来监听的,网易云主机最好配置0.0.0.0,这样私有ip和机房ip都可以监听到。

network.bind_host: 0.0.0.0

#设置其它节点和该节点交互的ip地址。网易云主机这里配置机房ip

#network.publish_host:0.0.0.0

network.port : 9200

#indexcache过期时间

#index.cache.field.expire:100m

#默认类型为resident, 字面意思是常驻(居民), 一直增加,直到内存 耗尽。 改为soft就是当内存不足的时候,先clear掉 占用的,然后再往内存中放。设置为soft后,相当于设置成了相对的内存大小。resident的话,除非内存够大。

index.cache.field.type: soft

#默认是3s,这是设置集群中自动发现其它节点时ping连接超时时间。

discovery.zen.ping.timeout: 40s #设置是否打开多播发现节点,默认是true。 #discovery.zen.ping.multicast.enabled: false

#指明集群中其它可能为master的节点ip,以防es启动后发现不了集群中的其他节点。

#discovery.zen.ping.unicast.hosts:["节点1的 ip","节点2 的ip","节点3的ip"]

(4)插件安装

安装head插件:

./bin/plugin install mobz/elasticsearch-head

(5)启动ES

./bin/elasticsearch

不幸的是报错了,后来在一个国外的论坛上看到ES启动时的用户和组不能和当前目录所属用户和组一致,我比较了一下,果然,我以root用户启动ES,而当前目录所属用户正好是root,找到原因了,那就换个用户启动吧。

可以看到,ES成功启动,好,到此,我们成功迈的向ELK迈出了一步。

打开链接:   http://localhost:9200/_plugin/head/

可以看到node0这个节点中有两个索引(前提条件已经新建索引且有数据了):applog .kibana,然后点击数据浏览,选中applog索引,可以看到applog索引下存储的日志。

好了,到此为止,你一定在想,这些数据从哪里来的吧,文章前面讲过,ES是一个model层,那么数据当然就是从controller层即logstash收集过来的。lets开始我们的第二步,搭建logstash。

第二步:安装logstash

logstash功能模块图

其实它就是一个收集器而已,我们需要为它指定Input和Output(当然Input和Output可以为多个)。由于我们需要把Java代码中Log4j的日志输出到ElasticSearch中,因此这里的Input就是Log4j,而Output就是ElasticSearch。

(1)下载logstash

wget   https://download.elastic.co/logstash/logstash/logstash-2.4.0.tar.gz

(2)解压

tar -zxvf   logstash-2.4.0.tar.gz

(3)根目录下创建config文件夹,然后创建log4j_to_es.conf文件

cd logstash-2.4.0
mkdir config
vim log4j_to_es.conf input {
log4j {
mode => "server"
host => "localhost" //网易云主机机房ip
port => 4567
}
}
filter {
#Only matched data are send to output.
}
output {
elasticsearch {
action => "index" #The operation on ES
hosts => "localhost:9200" #ElasticSearch host, can be array.
index => "applog" #The index to write data to.
}
}

(4)启动logstash

./bin/logstash agent -f config/log4j_to_es.conf

到此,logstash安装成功,logstash是一个收集器,刚刚我们在配置文件里配置了log4j的收集配置,所以,在我们的项目里,把log4j的配置加一个socket appender就可以了

# appender socket
log4j.rootLogger=${log4j.level}, stdout,socket
log4j.appender.socket=org.apache.log4j.net.SocketAppender
log4j.appender.socket.Port=4567
#log4j.appender.socket.Threshold=ERROR
log4j.appender.socket.RemoteHost=localhost
log4j.appender.socket.layout=org.apache.log4j.PatternLayout
log4j.appender.socket.layout.ConversionPattern=%d %-5p %c%x - %m%n
log4j.appender.socket.ReconnectionDelay=10000

好了,到此,ES和logstash搭建完毕,基本上可以实现日志的收集和存储了。可是这还不够,文章开头,我们举了饼状图和柱状图的两个例子,那么这两种图是怎么生成的呢?那就看一下我们的view层kibana,开始我们的第三步:安装kibana。

第三步:kibana安装

(1)下载kibana

wget   https://download.elastic.co/kibana/kibana/kibana-4.6.1-linux-x86_64.tar.gz

这里要注意下,kibana的版本很多,下载的时候要参考ES的版本,由于我们的ES安装的是2.4.1,所以我们这里使用Kibana4.6.1,选择kibana版本时一定要保证和ES版本的兼容。

(2)解压kibana

tar -zxvf kibana-4.6.1-linux-x86_64.tar.gz

(3)配置kibana

root@wangbei-ThinkPad-E560:/usr/local/elk# cd kibana-4.6.1-linux-x86_64
root@wangbei-ThinkPad-E560:/usr/local/elk/kibana-4.6.1-linux-x86_64# vim config/kibana.yml server.port: 5601
server.host: "localhost"
elasticsearch.url: http://localhost:9200
kibana.index: ".kibana"

(4)启动kibana

root@wangbei-ThinkPad-E560:/usr/local/elk/kibana-4.6.1-linux-x86_64# ./bin/kibana

好了,到此,大功告成,浏览器打开:   http://localhost:5601

为了后续使用Kibana,需要配置至少一个Index名字或者Pattern,它用于在分析时确定ES中的Index。这里我输入之前配置的Index名字applog,Kibana会自动加载该Index下doc的field,并自动选择合适的field用于图标中的时间字段:

创建完索引之后,你就可以领略ELK的强大啦!

快捷的搜索方式,强大好用的搜索语法,牛叉的图形绘制,简直碉堡!

最主要的还是将日志集中化管理,可视化呈现,实时化监控!

还有以后再也不用苦逼的ssh less grep了,那些复杂的日志分析也迎刃而解啦!

不得不感叹,大好福利真的来啦!

注意:

ELK线上的使用还要注意ES的内存配置,网络设置等等因素。


网易云免费体验馆,0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区

相关文章:
【推荐】 知物由学 | 你真的了解网络安全吗?
【推荐】 试水新的Angular4HTTPAPI

线上日志集中化可视化管理:ELK的更多相关文章

  1. Flume线上日志采集【模板】

    Flume线上日志采集[模板] 预装软件 Java HDFS Lzo/Lzop 系统版本 Flume 1.5.0-cdh5.4.0 系统流程图 flume-env.sh配置文件 export JAVA ...

  2. 研发流程 接口定义&开发&前后端联调 线上日志观察 模型变动

    阿里等大厂的研发流程,进去前先了解一下_我们一起进大厂 - SegmentFault 思否 https://segmentfault.com/a/1190000021831640 接口定义 测试用例评 ...

  3. Nodejs线上日志部署

    Nodejs 被越来越多的使用到线上系统中,但线上系统没有日志怎么行呢. 一.forever记录日志 我的线上系统使用forever来启动服务,最开始就直接使用了forever来记录 forever ...

  4. 从线上日志统计接口访问量QPS

    这一阵子在面试,连续遇到好几家(大小厂都有)问我的项目线上qps的情况了,说实话,我作为一个大头兵,本来没关注过这个数据,只能含混地给个"大概.也许"的回答. 回来之后,我决定对业 ...

  5. 查看线上日志利器less

    less实用命令 搜索 很多关于命令的解释有点令人困惑,因为前字,forward是向前,before也是前面. 上表示backward 下表示forward 向下搜索 / - 使用一个模式进行搜索,并 ...

  6. 记一次ArrayList产生的线上OOM问题

    前言:本以为(OutOfMemoryError)OOM问题会离我们很远,但在一次生产上线灰度的过程中就出现了Java.Lang.OutOfMemoryError:Java heap space异常,通 ...

  7. Java架构师线上问题排查,这些命令程序员一定用得到!

    Java架构师线上问题排查,这些命令程序员一定用得到! 线上问题排查,以下场景,你遇到过吗? 一.了解机器连接数情况 问题:1.2.3.4的sshd的监听端口是22,如何统计1.2.3.4的sshd服 ...

  8. 原创 记录一次线上Mysql慢查询问题排查过程

    背景 前段时间收到运维反馈,线上Mysql数据库凌晨时候出现慢查询的报警,并把原始sql发了过来: --去除了业务含义的sql update test_user set a=1 where id=1; ...

  9. CODING DevOps 助力中化信息打造新一代研效平台,驱动“线上中化”新未来

    中化信息技术有限公司,简称"中化信息",是世界 500 强企业中国中化控股有限责任公司(简称"中国中化")的全资直属公司,依托于中国中化的信息化建设实践,建立起 ...

随机推荐

  1. MySQL GTID (一)

    MySQL GTID 系列之一 一.GTID相关概念 GTID:全局事务标识符,MySQL5.6版本开始在主从复制中推出的重量级特性. 每提交一个事务,当前执行线程都会拿到一个给定复制环境中唯一的GT ...

  2. 【317】python 指定浏览器打开网页 / 文件

    一.python 打开浏览器的方法: 1. startfile方法(打开指定浏览器) import os os.startfile("C:\Program Files\internet ex ...

  3. springmvc 类型转换器 数据回显及提示信息

    处理器的写法: 类型转换器的写法: 类型转换器在springmvc.xml中的配置如下: index.jsp的写法:

  4. python's object model

    [python's object model] 1.object.__init__(self[, ...])        如果subclass没有实现__init__,那么python类在实例化的时 ...

  5. open中的mode

    [open中的mode] 当使用O_CREAT标志的open来创建文件时,我们必须使用三个参数格式的open调用.第三个参数mode 是几个标志按位OR后得到的.他们是: S_IRUSR: 读权限,文 ...

  6. shell脚本学习指南-学习(1)

    1.先看下面这个命令: $who  | wc  -l  计算当前登陆的用户个数: $who   当前登陆的有哪些用户: pipeling(   |  )可以在两个程序之间建立管道,左侧的结果成为右侧的 ...

  7. 裸函数naked解析

    先分享一个案例: #include <stdio.h> __declspec(naked) void Test() { int x; x = ; __asm ret; } int main ...

  8. Django基础模板案例

    想要用django  访问一个页面 同时传参数过去.在页面中接受参数 案例:附代码 #创建一个项目 项目名字是 yhl_test django-admin startproject yhl_test ...

  9. java高级工程师(二)

    一.Java底层基础题 1.SpringMVC的原理以及返回数据如何渲染到jsp/html上? 答:Spring MVC的核心就是 DispatcherServlet , 一个请求经过 Dispatc ...

  10. CiteSpace安装使用简介

    一.简介 CiteSpaceⅡ基于JAVA平台的信息可视化软,是美国Drexel大学陈超美(Chaomei Chen)教授开发的,用于文献引文网络分析的信息,作为文献计量学方面最先进的分析工具之一,是 ...