当前位置: 首页 > news >正文

使用ELK构建分布式日志分析系统

分布式系统的日志散落在各个服务器上,对于监控和排错非常不利,我们基于ELK构建了整套日志收集,分析,展示系统。

架构图

主要思路

1.整理Rails日志

我们最关心的是Rails的访问日志,但是Rails日志本身的格式是有问题的,举个例子

Started GET "/" for 10.1.1.11 at 2017-07-19 17:21:43 +0800
Cannot render console from 10.1.1.11! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by Rails::WelcomeController#index as HTML
  Rendering /home/vagrant/.rvm/gems/ruby-2.4.0@community-2.4/gems/railties-5.1.2/lib/rails/templates/rails/welcome/index.html.erb
  Rendered /home/vagrant/.rvm/gems/ruby-2.4.0@community-2.4/gems/railties-5.1.2/lib/rails/templates/rails/welcome/index.html.erb (2.5ms) Completed 200 OK in 184ms (Views: 10.9ms)
复制代码

可以看到,一次请求的日志散落在多行中,而且在并发情况下,不同请求的日志会交织在一起,针对这个问题,我们使用logstasher重新生成一份JSON格式的日志

{"identifier":"/home/vagrant/.rvm/gems/ruby-2.4.0@community-2.4/gems/railties-5.1.2/lib/rails/templates/rails/welcome/index.html.erb","layout":null,"name":"render_template.action_view","transaction_id":"35c707dd9d4cd1a79f37","duration":2.34,"request_id":"bc291df8-8681-47d3-8e10-bd5d93a021a0","source":"unknown","tags":[],"@timestamp":"2017-07-19T09:29:05.969Z","@version":"1"}
{"method":"GET","path":"/","format":"html","controller":"rails/welcome","action":"index","status":200,"duration":146.71,"view":5.5,"ip":"10.1.1.11","route":"rails/welcome#index","request_id":"bc291df8-8681-47d3-8e10-bd5d93a021a0","source":"unknown","tags":["request"],"@timestamp":"2017-07-19T09:29:05.970Z","@version":"1"}
复制代码

2.使用Logstash收集日志

Logstash通过一份配置文件描述了数据从哪里来,经过怎样的处理流程,输出到何处这整套流程,分别对应于input,filter,output三个概念。

我们先使用简单的配置来验证一下正确性

input {
  file {
    path => "/home/vagrant/blog/log/logstash_development.log"
      start_position => beginning
      ignore_older => 0
    }
}
output {
        stdout {}
}
复制代码

在这份配置中,我们从上一步生成的日志文件中读取,并输出到stdout中,结果如下

2017-07-19T09:59:01.520Z precise64 {"method":"GET","path":"/","format":"html","controller":"rails/welcome","action":"index","status":200,"duration":4.85,"view":3.28,"ip":"10.1.1.11","route":"rails/welcome#index","request_id":"27b8e5a5-dd1d-4957-9c91-435347d50888","source":"unknown","tags":["request"],"@timestamp":"2017-07-19T09:59:01.030Z","@version":"1"}
复制代码

然后,修改Logstash的配置文件,将output改为Elasticsearch

input {
  file {
    path => "/vagrant/blog/log/logstash_development.log"
      start_position => beginning
      ignore_older => 0
    }
}

output {
  elasticsearch {
    hosts => [ "localhost:9200" ]
    user => 'xxx'
    password => 'xxx'
  }
}
复制代码

可以看到,整个配置文件的可读性是非常高的,input中描述了输入源是我们整理好的日志文件,输出到Elasticsearch中。

然后就可以使用Kibanana来进行日志分析的工作了。

3. Kibana的一些实践

基于Kibana,我们可以定制Elasticsearch的搜索,来查询一些非常有价值的数据

  • 查询某个接口的请求情况
  • 查询耗时在500ms以上的超慢接口
  • 查询线上报500的接口
  • 统计高频接口 ......

4.Future

有了ELK提供的数据,我们已经可以比较方便的完成分布式情况下的错误排查,高频接口统计,为下一步的优化提供了指导。我们不必再根据业务逻辑去猜测哪些才是20%的热点,而是有了实实在在的数据支撑。

5. 问题

当然,在使用过程中也遇到过一些问题。在活动期间,访问量暴增的情况下,Elasticsearch吃了很多内存,直接拖垮了两台机器。我们通过临时关闭几台web server上的logstash暂时解决了这个问题。后续还需要对JVM进行一些调优。

相关文章:

  • 后端的一些经验与心得
  • 超过父控件的部分不能响应事件怎么办
  • WKWebView的使用总结(oc与js交互使用心得)
  • JavaScript 中的错误隔离
  • golang测试
  • java在线聊天项目 客户端登陆窗口LoginDialog的注册用户功能 修改注册逻辑 增空用户名密码的反馈 增加showMessageDialog()提示框...
  • 八个维度,谈谈产品经理的分类与发展方向
  • 第一课 安装 登陆CentOS 7
  • 创建和使用数据库
  • CSS中使用expression完美设置页面最小宽度
  • Android 从SetContentView()谈起
  • 为什么volatile不能保证原子性而Atomic可以?
  • SQL优化常用方法44
  • NoSQL
  • session再次理解
  • [NodeJS] 关于Buffer
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Facebook AccountKit 接入的坑点
  • Hibernate【inverse和cascade属性】知识要点
  • Joomla 2.x, 3.x useful code cheatsheet
  • js算法-归并排序(merge_sort)
  • Quartz初级教程
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 机器学习 vs. 深度学习
  • 记录:CentOS7.2配置LNMP环境记录
  • 记一次删除Git记录中的大文件的过程
  • 前端_面试
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • mysql面试题分组并合并列
  • 阿里云服务器如何修改远程端口?
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • !!Dom4j 学习笔记
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)(1.13) SiK无线电高级配置(五)
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2015)JS ES6 必知的十个 特性
  • (AngularJS)Angular 控制器之间通信初探
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (多级缓存)缓存同步
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (三)uboot源码分析
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转) 深度模型优化性能 调参
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • .gitignore文件_Git:.gitignore
  • .net中应用SQL缓存(实例使用)
  • //解决validator验证插件多个name相同只验证第一的问题