本节内容以go语言设计一个简易的日志收集系统,并且完成日志的客户端开发。

项目背景

每个系统都有日志,当系统出现问题的时候需要通过日志解决问题。

当系统机器比较少时,登录服务器即可查看日志。但当机器规模较大时,登录机器看就不太现实,这个时候就需要日志收集系统。

解决方案

  1. 把机器上的日志实时收集,统一存储到一个中心系统。
  2. 对日志建立索引,通过搜索即可找到对应的日志。
  3. 通过提供友好的web界面,完成日志的搜索查找。

面临的问题

  1. 实时日志量非常大,每天几十亿条
  2. 日志准时收集,延迟控制在分钟级别
  3. 能够水平扩展

业界方案ELK

ELK的方案架构如下,

ELK存在的问题:

  1. 运维成本高,每增加一个日志收集,都需要手动修改配置
  2. 监控缺失,无法准确获取logstash的状态
  3. 无法做定制化开发以及维护

我们的日志收集系统

各组件介绍如下

  • Log Agent,日志收集客户端,用来收集服务器上的日志
  • Kafka,高吞吐量的分布式队列,linkin开发,apache顶级开源项目。使用Kafka可以实现日志收集和日志处理的解耦。
  • ES,elasticsearch,开源的搜索引擎,提供基于http restful的web接口
  • Hadoop,分布式计算框架,能够对大量数据进行分布式处理的平台
  • Storm,Storm是Twitter开源的分布式实时大数据处理框架,被业界称为实时版Hadoop。
  • 除了图中的基本部件外,Log Agent需要连接ETCD和WEB界面进行日志存储和日志配置。

Kafka应用场景

1. 异步处理, 把非关键流程异步化,提高系统的响应时间和健壮性

2. 应用解耦,通过消息队列

3. 流量削峰

zookeeper应用场景

1. 服务注册&服务发现

2. 配置中心

3. 分布式锁

  • Zookeeper是强一致的
  • 多个客户端同时在Zookeeper上创建相同znode,只有一个创建成功

项目实践

我们的项目实践又如下几部分内容构成:

  1. linux上的kafka安装
  2. 生产者log agent开发
  3. etcd+contex+kafka消费者开发
  4. WEB日志管理平台开发

kafka安装

  1. 安装JDK,从oracle下载最新的SDK安装
  2. 安装zookeeper3.3.6,下载地址:http://apache.fayea.com/zookeeper/
    1. mv conf/zoo_sample.cfg conf/zoo.cfg
    2. 编辑 conf/zoo.cfg,修改dataDir=D:\zookeeper-3.3.6\data\
    3. 运行bin/zkServer.cmd
  3. 安装kafka
    1. 打开链接:http://kafka.apache.org/downloads.html下载kafka2.1.2
    2. 打开config目录下的server.properties, 修改log.dirs为D:\kafka_logs,       修改advertised.host.name=服务器ip
    3. 启动kafka ./bin/windows/kafka-server-start.bat ./config/server.preperties

生产者log agent

我们构建一个日志客户端log agent作为生产者。需要用到的go的包为:

  • Import “github.com/Shopify/sarama":基于sarama第三方库开发的 kafka client,往kafka里面发送消息
  • Import “github.com/hpcloud/tail”:HP团队出的tail库,常用于日志收集
  • Import “github.com/astaxie/beego/config”
  • Import “github.com/astaxie/beego/logs”

log agent设计

我们的go语言设计log agent用到的模块和模块数据流如下:

kafka示例代码

Import “github.com/Shopify/sarama"

程序示例:

package mainimport ("fmt""github.com/Shopify/sarama"
)func main() {config := sarama.NewConfig()config.Producer.RequiredAcks = sarama.WaitForAllconfig.Producer.Partitioner = sarama.NewRandomPartitionerconfig.Producer.Return.Successes = truemsg := &sarama.ProducerMessage{}msg.Topic = "nginx_log"msg.Value = sarama.StringEncoder("this is a good test, my message is good")client, err := sarama.NewSyncProducer([]string{"192.168.31.177:9092"}, config)if err != nil {fmt.Println("producer close, err:", err)return}defer client.Close()pid, offset, err := client.SendMessage(msg)if err != nil {fmt.Println("send message failed,", err)return}fmt.Printf("pid:%v offset:%v\n", pid, offset)
}

tailf介绍

tailf组件使用

Import “github.com/hpcloud/tail”

程序示例:

package mainimport ("fmt""github.com/hpcloud/tail""time"
)
func main() {filename := "./my.log"tails, err := tail.TailFile(filename, tail.Config{ReOpen:    true,Follow:    true,Location:  &tail.SeekInfo{Offset: 0, Whence: 2},MustExist: false,Poll:      true,})if err != nil {fmt.Println("tail file err:", err)return}var msg *tail.Linevar ok boolfor true {msg, ok = <-tails.Linesif !ok {fmt.Printf("tail file close reopen, filename:%s\n", tails.Filename)time.Sleep(100 * time.Millisecond)continue}fmt.Println("msg:", msg)}
}

配置文件库使用

Import “github.com/astaxie/beego/config”

程序示例:

package mainimport ("fmt""github.com/astaxie/beego/config"
)func main() {conf, err := config.NewConfig("ini", "./logcollect.conf")if err != nil {fmt.Println("new config failed, err:", err)return}port, err := conf.Int("server::port")if err != nil {fmt.Println("read server:port failed, err:", err)return}fmt.Println("Port:", port)log_level, err := conf.Int("log::log_level")if err != nil {fmt.Println("read log_level failed, ", err)return}fmt.Println("log_level:", log_level)log_path := conf.String("log::log_path")fmt.Println("log_path:", log_path)
}

日志库的使用

Import “github.com/astaxie/beego/logs”

程序示例:

package mainimport ("encoding/json""fmt""github.com/astaxie/beego/logs"
)func main() {config := make(map[string]interface{})config["filename"] = "./logs/logcollect.log"config["level"] = logs.LevelDebugconfigStr, err := json.Marshal(config)if err != nil {fmt.Println("marshal failed, err:", err)return}logs.SetLogger(logs.AdapterFile, string(configStr))logs.Debug("this is a test, my name is %s", "stu01")logs.Trace("this is a trace, my name is %s", "stu02")logs.Warn("this is a warn, my name is %s", "stu03")
}

生产者具体程序运行过程参考:

Go语言学习之11 日志收集系统kafka库实战 - pointerC++ - 博客园本节主要内容: 1. 日志收集系统设计2. 日志客户端开发 1. 项目背景 a. 每个系统都有日志,当系统出现问题时,需要通过日志解决问题 b. 当系统机器比较少时,登陆到服务器上查看即可满足 c.https://www.cnblogs.com/xuejiale/p/10657989.html

消费者etcd+contex+kafka

etcd介绍

etcd介绍与使用:

  • 概念:高可用的分布式key-value存储,可以使用配置共享和服务发现
  • 类似项目:zookeeper和consul
  • 开发语言:Go
  • 接口:提供restful的http接口,使用简单
  • 实现算法:基于raft算法的强一致性、高可用的服务存储目录

etcd的应用场景:

  • 服务发现和服务注册
  • 配置中心
  • 分布式存储
  • master选举

context使用介绍

contex主要作用如下:

  • 如何控制goroutine
  • 如何保存上下文数据

消费者具体程序运行过程参考:

Go语言学习之12 etcd、contex、kafka消费实例、logagent - pointerC++ - 博客园本节内容: 1. etcd介绍与使用 2. ElastcSearch介绍与使用 1. etcd介绍与使用 概念:高可用的分布式key-value存储,可以使用配置共享和服务发现 类似项目:zookeehttps://www.cnblogs.com/xuejiale/p/10660857.html

WEB日志管理平台

我们会用到如下知识点:

  1. ElasticSearch介绍与使用
  2. kibana介绍与使用

1. ElasticSearch安装

详见上节内容
2. kibana安装

(1) 下载ES,下载地址:https://www.elastic.co/start
(2)解压缩
(3)启动kibana, ./bin/kibana.bat
(4)在浏览器中访问: http://localhost:5601
         Username: elastic Passwd: changeme

3. nginx安装

(1)下载nginx,下载地:https://nginx.org
(2)解压缩
(3)启动nginx, ./nginx
(4)在浏览器中访问: http://localhost

4. mysql事务

(1) 原子性
(2)一致性
(3)隔离性
(4)持久性

5. mysql事务

(1)import (“github.com/jmoiron/sqlx")
(2)Db.Begin()开始事务
(3)Db.Submit()提交事务
(4)Db.Rollback() 回滚事务

6. Beego web开发

(1)规划好url
(2)添加路由
(3)开发controller,继承beego.Controller
(4)测试

Beego 模板渲染

1)把需要传给模板的变量赋值给beego.controller里面的Data字段
2)实现模板逻辑

详见博客:一、Beego介绍与项目创建及启动 - pointerC++ - 博客园一、beego 简介 beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API、Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornahttps://www.cnblogs.com/xuejiale/p/10562074.html

go日志收集系统项目简介相关推荐

  1. printf 重新实现put_Go 实现海量日志收集系统(四)

    2020.1.16 51Reboot 将在 2020.1.16日(今天) 21:00 为您带来分享主题<大佬教你如何从 ES 初学者到 ES专家> 直播链接(提前报名):https://k ...

  2. ELK 日志收集系统方案

    文章目录 背景 ELK使用组件简介 方案1 ELK 方案二 EFK 方案三: FELK 方案四:个性化框架 总结: 日志展示及查询 环境 背景 在项目初期的时候,大家都是赶着上线,一般来说对日志没有过 ...

  3. go语言日志收集系统

    0.项目地址 完整项目的GitHub地址 https://github.com/taw19960426/learning-go-language/tree/main/go-log-collect 一. ...

  4. 一起来解读分布式日志收集系统:Facebook Scribe

    1.分布式日志收集系统:背景介绍 许多公司的平台每天会产生大量的日志(一般为流式数据,如,搜索引擎的pv,查询等),处理这些日志需要特定的日志系统,一般而言,这些系统需要具有以下特征: (1) 构建应 ...

  5. 分布式日志收集系统: Facebook Scribe

    转载于博主新浪微博:http://weibo.com/freshairbrucewoo. 欢迎大家相互交流,共同提高技术. 以下是我在公司内部分享的关于分布式日志收集系统的PPT内容,现在与大家分享, ...

  6. python分布式日志收集系统_分布式日志收集系统Scribe原理

    1.分布式日志收集系统:背景介绍 许多公司的平台每天会产生大量的日志(一般为流式数据,如,搜索引擎的pv,查询等),处理这些日志需要特定的日志系统,一般而言,这些系统需要具有以下特征: (1) 构建应 ...

  7. 借鉴开源框架自研日志收集系统

    踏浪无痕 岂安科技高级架构师 十余年数据研发经验,擅长数据处理领域工作,如爬虫.搜索引擎.大数据应用高并发等.担任过架构师,研发经理等岗位.曾主导开发过大型爬虫,搜索引擎及大数据广告DMP系统目前负责 ...

  8. python分布式日志收集系统_Go实现海量日志收集系统(一)

    项目背景 每个系统都有日志,当系统出现问题时,需要通过日志解决问题 当系统机器比较少时,登陆到服务器上查看即可满足 当系统机器规模巨大,登陆到机器上查看几乎不现实 当然即使是机器规模不大,一个系统通常 ...

  9. Flume日志收集系统架构详解--转

    2017-09-06朱洁大数据和云计算技术 任何一个生产系统在运行过程中都会产生大量的日志,日志往往隐藏了很多有价值的信息.在没有分析方法之前,这些日志存储一段时间后就会被清理.随着技术的发展和分析能 ...

  10. 你居然还去服务器上捞日志,搭个日志收集系统难道不香么!

    摘要 ELK日志收集系统进阶使用,本文主要讲解如何打造一个线上环境真实可用的日志收集系统.有了它,你就可以和去服务器上捞日志说再见了! ELK环境安装 ELK是指Elasticsearch.Kiban ...

最新文章

  1. Actor-ES框架:消息发布器与消息存储器
  2. 定时任务的实现原理,看完就能手撸一个!
  3. CVPR2020|无需3D运动数据训练,最新SOTA人体姿势估计方法
  4. dict实现原理 python_5分钟看懂系列:Python 线程池原理及实现
  5. Mediator模式(C++中介者模式含个人Demo源码)
  6. AI 芯片为何遭遇滑铁卢?
  7. 机器学习笔记——感知机理解(自行取用,并不一定适合每个人)
  8. kindeditor在Firefoxt 和 Chrome 下不能取到值的解决方法
  9. 时间序列(一):时间序列数据与时间序列预测模型
  10. Oracle -- rollup函数
  11. 通过SecurityUtils获取Subject详解
  12. linux运维的名言,Linux之父十大名言 你曾听说过几句?
  13. 想将PPT的文字转换到Word文档?看这一篇就够了!!!
  14. 视频剪辑3.5版-一分钟生成上百个电影混剪视频
  15. 《2022中国RPA采购指南》报告正式发布
  16. win10如何共享整个D盘
  17. 5 个牛逼的算法设计,你知道几个?
  18. 应变片信号采集--串口程序--借助python和tkinter
  19. 错失电商风口,国美还能让谁“真快乐”?
  20. 在ppt中加入python_在ppt中加入python下载

热门文章

  1. 分布式服务架构:原理、设计与实践
  2. Linux驱动之Kconfig语法——学习笔记(11)
  3. keil5怎么添加stc芯片库
  4. 【ENVI】FLAASH大气校正工具中比例因子说明
  5. C++语言,线性素数筛(欧拉筛)
  6. 学习笔记:AGPS-SUPL架构
  7. 咸鱼3D打印—3D打印的基本流程
  8. 3D打印-切片软件简介
  9. 一文让你看懂什么是嵌入式和单片机。
  10. 电力拖动自动控制系统 华南理工大学期末重点 阮毅 长篇思维导图