ELK日志系统


    当公司达到一定规模,基础日志平台是必不可少的。传统的tail -fn100 xxx.log 只能一次性查看某一台服务器的项目,对于集群项目想定位bug,是一件非常痛苦的事情,
对于一个自动化日志平台至少得有一下几个功能,1、可以根据日期和关键字组合定位日志,2、可以实时跟踪多台服务器的日志类似于tail -fn3、实现权限控制,因为公司不同组别
只允许看到所在组的日志,如果要精细化日志平台的功能开源的elk就需要深度定制了,这篇文章只是记录下elk的简单实用。

ELK文档

ELK是指Elasticsearch,Logstash,Kibana的组合
1、Filebeat:监控日志文件、转发,获取指定路径的日志文件,传输日志文件给Logstash;
文档地址:https://www.elastic.co/guide/en/beats/filebeat/current/index.html
2、Logstash: 日志收集,管理,存储,转发日志给Elasticsearch进行处理;
文档地址:https://www.elastic.co/guide/en/logstash/current/index.html
3、Elasticsearch:搜索,提供分布式全文搜索引擎,搜索是实时进行处理的,对数据进行索引和聚合等;
文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
4、Kibana :日志的过滤web展示,图形界面话操作日志记录。别名Elasticsearch Dashboard 顾名思义是基于游览器的Elasticsearch分析和仪表盘工具;
文档地址:https://www.elastic.co/guide/en/kibana/current/index.html

ELK流程图

流程图

整个流程架构图如上图所示,filebeta用来监控各个日志文件,然后传输给logstash,然后通过logstatsh的过滤和处理
再转发给elasticsearch,然再通过Kibana进行大屏展现。当然在logstatsh到elasticsearch这一步,为了减少elasticsearch的压力
可以在中间再加一层nosql 如kafka或者redis的缓存。

搭建和配置文件记录

  • 搭建过程略可参考博客:博客地址一
    博客地址二
  • elk启动顺序

    首先启动elasticsearch集群和Kibana ,然后启动Logstash 再启动filebeat
    
    • filebeat配置文件filebeat.yml需要修改的地方
    • filebeat.prospectors可以配置多个-input_type节点,这样可以监控不同的目录
    • input_type的类型为log时候将会每次读取一行文件
    • document_type的值可以为后来的elasticsearch的索引命名
    • fields:这个值我们可以自定义变量名称
    • output.logstash:配置logstash的端口
filebeat.prospectors:
- input_type: log
  paths:
    - d:\data\logs\timer_log\pushmsg\pushMsgInfoLog.log
  #document_type小写,不然索引不了
  document_type: pushmsginfo
  fields:
    level: debug
- input_type: log
  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - d:\data\logs\timer_log\pushmsg\pushmsg.log
  document_type: pushmsg
output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5044"]
  • logstash的配置文件
    • document_type的值等于filebeat.yml里面配置的值
input {
  beats {
    port => 5044
  }
}
filter {
    mutate {
        # 替换元数据host的值
        replace => ["host", "10.140.46.134"]
    }
}

output {
     stdout{
        codec=>rubydebug
    }
    elasticsearch {
    hosts => "localhost:9200"
    manage_template => false
    index => "logstash-%{type}-%{+YYYY.MM.dd}"
    document_type => "%{type}"
  }
}
  • elasticseach和kinba访问地址

    http://localhost:9200/_plugin/head/
    

    http://localhost:5061/
    

ELK定制方案

    公司基础服务组在elk的基础上定制了一套log平台,实现了根据配置指定路径和服务器ip +组合条件和时间
进行定位日志。

我们可以在一个通用的项目资产配置平台里面,把项目的信息配置上去,例如项目部署在那几台服务器、和项目日志所在的路径、项目的模块等等
然后我们在每台服务器上面部署一个脚本,脚本定时去项目资产平台webget一个filebeta.yml,这样就可以通用的部署filebeat了。
  • 生产filebeat的动态配置文件
    • 公司里面是把信息丢到kafka里面再处理的
shipper:
  name: 172154-filebeat-1
  queue_size: 1000
filebeat:
  spool_size: 2048
  idle_timeout: 2s
  registry_file: /data/logs/filebeat/filebeat-1/.filebeat
  publish_async: false
  prospectors:
  - paths:
    - /data/logs/tomcat/mseckill/mseckillWAR.log
    document_type: logs
    ignore_older: 24h
    close_older: 1h
    scan_frequency: 10s
    tail_files: true
    force_close_files: true
    fields_under_root: true
    fields:
      app: mseckill
      server: tomcat
      ver: 1
      hostip: 172.25.172.154
      logname: mseckillWAR
      module: mobile
      assigner: ggj2010
      logid: 1489479045789
    multiline:
      pattern: '^[[:space:]]+|^Caused by:'
      negate: false
      match: after
      max_lines: 500
output.kafka:
  hosts:  ["172.25.156.113:9092","172.25.156.114:9092","172.25.156.115:9092"]
  topic: ule-business
  key: ule-business
  partition.round_robin:
      reachable_only: false
  required_acks: 1
  compression: gzip
  max_message_bytes: 1000000
logging:
  level: info
  to_files: true
  to_syslog: false
  files:
    path: /data/logs/filebeat/filebeat-1
    rotateeverybytes: 104857600
    name: filebeat.log
    keepfiles: 7