zoukankan      html  css  js  c++  java
  • 线上日志集中化可视化管理:ELK


    本文来自网易云社区

    作者:王贝


    为什么推荐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+款云产品! 

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

    相关文章:
    【推荐】 扫脸动画

  • 相关阅读:
    stenciljs 学习四 组件装饰器
    stenciljs 学习三 组件生命周期
    stenciljs 学习二 pwa 简单应用开发
    stenciljs ionic 团队开发的方便web 组件框架
    stenciljs 学习一 web 组件开发
    使用npm init快速创建web 应用
    adnanh webhook 框架 hook rule
    adnanh webhook 框架 hook 定义
    adnanh webhook 框架request values 说明
    adnanh webhook 框架execute-command 以及参数传递处理
  • 原文地址:https://www.cnblogs.com/zyfd/p/9722658.html
Copyright © 2011-2022 走看看