zoukankan      html  css  js  c++  java
  • ELK日志分析方案

    针对公司项目微服务化,随着项目及服务器的不断增多,决定采用ELK(Elasticsearch+Logstash+Kibana)日志分析平台进行微服务日志分析。

    1.ELK整体方案

    1.1 ELK架构图

    1.2 ELK工作流程

    1.在微服务服务器上部署Logstash,作为Shipper的角色,对微服务日志文件数据进行数据采集,将采集到的数据输出到Redis消息队列。

    2.在另外一台服务器上部署Logstash,作为Indexer的角色,从Redis消息队列中读取数据(可以对数据进行处理),输出到Elasticsearch-Master主节点。

    3.Elasticsearch-Master主节点内部与副节点同步数据。(Elasticsearch集群建议3个服务以上奇数)

    4.Kibana部署一台服务器内,读取Elasticsearch集群数据,展示Web查询页面,提供数据展示。

    2.消息队列选型

    2.1 Redis

    在我这个最终方案中,选择了使用Redis作为消息队列进行缓冲,降低Elasticsearch压力,起到削峰作用,主要原因还是由于公司考虑成本问题,日志收集也是只针对我们单个项目组来使用,所以选择了公司现在就已经有的Redis集群进行复用。

    2.2 Kafka

    最初方案中,在消息队列上选择的是Kafka,毕竟Kafka天生就是做为消息队列的,具体二者的毕竟在这里我就不多说了,百度上一大堆。

    3.安装

    这里就不在这里写出来了,提供三个地址仅供参考:

    Linux安装Logstash
    Linux安装Kibana
    Linux安装Elasticsearch

    4.Logstash配置

    4.1 log2redis

    从日志文件读取到redis

    #从日志文件读取数据
    #file{}
    #type 日志类型
    #path 日志位置
    #            可以直接读取文件(a.log)
    #            可以所有后缀为log的日志(*.log)
    #            读取文件夹下所有文件(路径)
    #start_position 文件读取开始位置 (beginning)
    #sincedb_path 从什么位置读取(设置为/dev/null自动从开始位置读取)
    input {
         file {
            type => "log"
            path => ["/root/logs/info.log"]
            start_position => "beginning"
            sincedb_path => "/dev/null"
         }
    }
    #根据时间戳分隔日志
    #grok 区分日志中得字段
    filter {
         multiline {
           pattern => "^%{TIMESTAMP_ISO8601} "
           negate => true
           what => previous
         }
         #定义数据的格式
         grok {
           match => { "message" => "%{DATA:datetime} - %{DATA:logLevel} - %{DATA:serviceName} - %{DATA:ip} - %{DATA:pid} - %{DATA:thread} - %{DATA-msg}"}
         }
    }
    #输出数据到Redis
    #host Redis主机地址
    #port Redis端口
    #db Redis数据库编号
    #data_type Redis数据类型
    #key Redis的key
    #password Redis密码
    output {
        redis {
            host => "ip"
            port => "6379"
            db => "6"
            data_type => "list"
            password => "password"
            key => "test_log"
        }
    }
    

    4.2 redis2es

    从redis读取到es

    #从redis内读取数据
    #host Redis主机ip
    #port Redis端口
    #data_type Redis数据类型
    #batch_count
    #password Redis密码
    #key Redis读取Key
    input {
        redis {
            host => "ip"
            port => "6379"
            db => "6"
            data_type => "list"
            password => "password"
            key => "test_log"
        }
    }
    #数据的输出我们指向了es集群
    #hosts Elasticsearch主机地址
    #index Elasticsearch索引名称
    output {
      elasticsearch {
            hosts => "ip:9200"
            index => "logs-%{+YYYY.MM.dd}"
      }
    }
    

    5 其他

    其他剩下的就是Es集群和Kibana了,这两个没什么特别值得注意的地方,上网随便搜,一大堆文章。

    以上仅仅代表本人项目使用方案,不一定完美适合所有场景,仅供参考。

  • 相关阅读:
    ajax
    Django之modelform组件
    Django之form组件
    orm事务与锁
    orm之多表操作
    orm之单表操作
    Django之orm
    Django之模板系统
    Django之视图
    hdu5698瞬间移动(杨辉三角+快速幂+逆元)
  • 原文地址:https://www.cnblogs.com/dalaoyang/p/9890126.html
Copyright © 2011-2022 走看看