热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

51Reboot 将在 2020.1.16日(今天) 21:00 为您带来分享主题《大佬教你如何从 ES 初学者到 ES专家》

直播链接(提前报名):https://ke.qq.com/course/482014?taid=4309905192737502&tuin=31589b0e

51Reboot 课程信息最新一期 Golang 课程

开课时间:2020.2.16

1、GO 并发

  • goroutine

  • channel

  • 有缓存 chan 和无缓存 chan,以及通信的一些细节

  • 常见并发模式

  • 锁与条件竞争

  • 实战

 并发 Web 爬虫

2、Beego 实战

  • Go Web 浅析

HTTP 协议 

net/http

  • Gin/Beego 框架对比介绍

  • 请求校验包的使用

  • 中间件 middleware ORM

  • 日志模块

3、堡垒机权限管理系统

  • 架构设计

  • HTTP 协议 加密传输

  • 分布式 Agent/Server 开发

  • Beego 可视化 Web 界面统管

  • 思考:如何对接服务树系统

4、分布式监控

  • 架构设计

  • GRPC 传输

  • Etcd 服务注册发现

  • Influxdb 存储

  • Granfan 展示

运维自动化进阶课程

实战项目一:SQL 自动化上线平台

  • 手动 VS 自动的现状对比

  • Mysql、Inception、SQLAdvisor 讲解

  • 用户权限设计、执行流程梳理、平台登录双因子安全认证

  • 敏感配置加解密实现、人员/数据库配置设计,整体代码实现

实战项目:公有云管理平台
  • 通过 API 对[Aws、阿里云、腾讯云、青云、百度云]管理

  • 公有云账单、比价、资源管理

实战项目:任务管理系统
  • Ansible 简介及常用场景分析

  • Ansible API 二次开发入门

  • 基于 Ansible Playbook API 快速实现任务管理系统

实战项目:工单系统
  • 工作中流程规范的设计思路

  • 典型工单系统的实现原理-状态机

实战项目:代码管理系统及发布平台
  • 基于 Gitlab + Jenkins + DevOps 平台实现 CI/CD 的设计思路

  • 结合运维平台流程规范实现持续集成与交付

  • 结合 ELK 的日志分析平台,实现代码上线运维无人值守

docker+k8s 课程

第一阶段:Docker 基础与进阶

第二阶段:Kubernetes 基础

第三阶段:Pod 与生命周期管理

  • Kubernetes 集群资源管理与调度管理

  • Kubernetes 控制器和常用资源对象

第四阶段:Kubernetes 服务发现

  • 持久化存储

第五阶段:Helm 包管理工具

第六阶段:Kubernetes 集群网络

  • Kubernetes 集群网络常用方案比较及选型建议

  • Flannel 网络组件详解

  • Flannel 网络组件配置及应用

  • Flannel 生产环境应用经验

  • Calico 网络组件详解

  • Calico 网络组件配置及应用

  • ......

第七阶段:Kubernetes 集群监控

  • Prometheus 介绍

  • 部署 Prometheus

  • 监控 Kubernetes 集群及应用

  • NodeExporter 的安装使用

  • Prometheus的自动发现

  • Kubernetes常用资源对象监控

  • Grafana的安装与使用

  • Grafana的插件与监控

  • .......

第八阶段:日志收集

  • 日志收集架构

  • Elasticsearch 集群

  • Kibana 可视化组件

  • Fluentd 采集组件

  • 生产环境采集日志方案详解

第九、十阶段:DevOps

  • 动态 Jenkins Slave

  • Jenkins Pipeline

  • Jenkins Blue Ocean

  • Harbor 详解

  • Gitlab 安装与使用

  • Gitlab CI Runner

  • Gitlab CI 示例

  • Kubernetes 开源管理平台

  • 完整 devops 项目实例

2e29870cf8a6d365bd9c27fa06b633f1.gifEND2e29870cf8a6d365bd9c27fa06b633f1.gif

来源

https://www.cnblogs.com/zhaof/p/8948516.html

接Go 实现海量日志收集系统(一)Go实现海量日志收集系统(二)Go 实现海量日志收集系统(三)

到这一步,我的收集系统就已经完成很大一部分工作,我们重新看一下我们之前画的图:

2d40f76da5d3e80167aa2127eb3081c1.png

我们已经完成前面的部分,剩下是要完成后半部分,将kafka中的数据扔到ElasticSearch,并且最终通过 kibana 展现出来

ElasticSearch

官网地址这里介绍了非常详细的安装方法:https://www.elastic.co/downloads/elasticsearch但是其实这里是需要配置一些东西的,要不然直接启动是会悲剧的,在网上找了一个地址,如果出现类似的错误直接处理就行,我自己已经验证了:https://blog.csdn.net/liangzhao_jay/article/details/56840941如下图所示就表示已经安装完成:

80c595af4c0f8648affc4d1e5ef2addb.png

f294539bba87f10746a674aae8d190a0.png

通过 go 写一个简单的调用 ElasticSearch 的例子:

package mainimport ( "fmt" elastic "gopkg.in/olivere/elastic.v2")type Tweet struct{ User string Message string}func main(){ client,err := elastic.NewClient(elastic.SetSniff(false),elastic.SetURL("http://192.168.0.118:9200/")) if err != nil{ fmt.Println("connect es error",err) return } fmt.Println("conn es succ") tweet := Tweet{User:"olivere name",Message:"Take Five"} _, err = client.Index().Index("twitter").Type("tweet").Id("1").BodyJson(tweet).Do() if err != nil { panic(err) return } fmt.Println("insert succ")}logtransfer

logtransfer 主要负责从 kafka队列中读取日志信息,并且添加到 ElasticSearch   中看那一下 logtransfer 目录结构如下:

├── conf│ └── app.conf├── es.go├── etcd.go├── ip.go├── kafka.go├── logs│ └── transfer.log└── main.go

conf : 存放配置文件es.go : 主要是连接 ElasticSearch 的部分以及用于将消息放到 ElasticSearch 中etcd.go : 主要用于做动态的配置更改,当我们需要将 kafka 中的哪些 topic 日志内容扔到 ElasticSearch 中ip.go : 用于获取当前服务器的 ip 地址kafka.go : 主要是 kafka 的处理逻辑,包括连接 kafka 以及从 kafka 中读日志内容main.go : 代码的入口函数

整体大代码框架,通过如图展示:

d1b64f854f42b9a2255f93db6745e0b6.png

和之前的 logagent 中的代码有很多启示是可以复用的或者稍作更改,就可以了,其中 es 之心的,主要是连接 ElasticSearch 并将日志内容放进去 es.go 的代码内容为:

package mainimport ( "gopkg.in/olivere/elastic.v2" "github.com/astaxie/beego/logs" "sync" "encoding/json")var waitGroup sync.WaitGroupvar client *elastic.Clientfunc initEs(addr string,) (err error){ client,err = elastic.NewClient(elastic.SetSniff(false),elastic.SetURL(addr)) if err != nil{ logs.Error("connect to es error:%v",err) return } logs.Debug("conn to es success") return}func reloadKafka(topicArray []string) { for _, topic := range topicArray{ kafkaMgr.AddTopic(topic) }}func reload(){ //GetLogConf() 从channel中获topic信息,而这部分信息是从etcd放进去的 for conf := range GetLogConf(){ var topicArray []string err := json.Unmarshal([]byte(conf),&topicArray) if err != nil { logs.Error("unmarshal failed,err:%v conf:%v",err,conf) continue } reloadKafka(topicArray) }}func Run(esThreadNum int) (err error) { go reload() for i:=0;i waitGroup.Add(1) go sendToEs() } waitGroup.Wait() return}type EsMessage struct { Message string}func sendToEs(){ // 从msgChan中读取日志内容并扔到elasticsearch中 for msg:= range GetMessage() { var esMsg EsMessage esMsg.Message = msg.line _,err := client.Index().Index(msg.topic).Type(msg.topic).BodyJson(esMsg).Do() if err != nil { logs.Error("send to es failed,err:%v",err) continue } logs.Debug("send to es success") } waitGroup.Done()}

最终我将 logagnet 以及logtransfer 部署到虚拟机上进行测试的效果是:

ed682f88cc5bef418ac00a2a9ec2c09b.png

这样当我再次查日志的时候就可以不用登陆每台服务器去查日志,只需要通过页面根据关键字迅速看到相关日志,当然目前实现的功能还是有点粗糙,etcd 的更改程序,是自己写的发送程序,其实更好的解决方法是通过页面,让用户点来点去,来控制自己要收集哪些日志,以及自己要将哪些 topic 的日志从 kafka 中放到 ElasticSearch (本人是做后端开发,不擅长前端的开发,不过后面可以试着写个页面试试,估计会很丑哈哈)。

同时这里关于各个部分的安装并没有做过多的介绍,以及维护,当然我们的目标是是通过这些开源的软件以及包来实现我们想要的功能,后期的维护,肯定需要对各个组件部分都进行深入了解。

这里附赠一下那个 etcd 客户端代码:

package mainimport ( "github.com/coreos/etcd/clientv3" "time" "fmt" "golang.org/x/net/context")var logconf = `[ { "topic":"eslservice_log", "log_path":"/opt/pbx/log/eslservice.log", "service":"eslservice", "send_rate":50000 }]`var test111 = `[ { "topic":"test_log", "log_path":"D:/a.log", "service":"test", "send_rate":50000 }]`var transconf = `[ "eslservice_log"]`func main() { cli, err := clientv3.New(clientv3.Config{ Endpoints:[]string{"192.168.90.78:2371"}, DialTimeout:5*time.Second, }) if err != nil { fmt.Println("connect failed,err:",err) return } fmt.Println("connect success") defer cli.Close() ctx,cancel := context.WithTimeout(context.Background(),time.Second) //_,err = cli.Put(ctx,"/logagent/192.168.90.11/log_config",logconf) //_,err = cli.Put(ctx,"/logagent/192.168.90.61/log_config",test111) _, err = cli.Put(ctx,"/logtransfer/192.168.90.11/log_config",transconf) cancel() if err != nil { fmt.Println("put failed ,err:",err) return } ctx,cancel = context.WithTimeout(context.Background(),time.Second) resp,err := cli.Get(ctx,"/logtransfer/",clientv3.WithPrefix()) cancel() if err != nil { fmt.Println("get failed,err:",err) return } for _,ev:=range resp.Kvs{ fmt.Printf("%s:%s\n",ev.Key,ev.Value) }}

到目前为止基本的功能都已经实现了,当然了现在的代码结构还有的糙,后面会进行优化!整个项目中的代码:logagent 代码地址:https://github.com/pythonsite/logagentlogtransfer 代码地址:https://github.com/pythonsite/logtransfer

3a4bf7caf651043dcdc3718b362289c7.png

关注我们 ,一起成长吧!



推荐阅读
  • 云计算安全,主要面临哪些威胁?
    云计算是一种新的计算方式,它依托于互联网,以网络技术、分布式计算为基础,实现按需自服务、快速弹性构建、服务可测量等特点的新一代计算方式。然而,任何以互联网为基础的应用都存在着一定危 ... [详细]
  • ASP.NET Core WebAPI 开发新建WebAPI项目  转
    转 http:www.cnblogs.comlinezerop5497472.htmlASP.NETCoreWebAPI开发-新建WebAPI项目ASP.NETCoreWebAPI ... [详细]
  • 导读:很多朋友问到关于入门学什么php框架简单的相关问题,本文编程笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!本文目录一览: ... [详细]
  • 缓冲区溢出实例(一)–Windows
    一、基本概念缓冲区溢出:当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被填满从而覆盖了相邻内存区域的数据。可以修改内存数据,造成进程劫持,执行恶意代码,获 ... [详细]
  • python有什么应用领域[python常见问题]
    python语言可以用来开发游戏,用于大数据的挖掘和处理,开发web,应用在系统运维,云计算,金融理财分析,人工智能等涉及 ... [详细]
  • Java学习日志(241网络编程自定义服务端与客户端)
    为什么80%的码农都做不了架构师?自定义服务端*演示客户端与服务端客户端:浏览器服务端:自定义*importjava.net.*;importjava ... [详细]
  • 我的LINUX学习之路之二十一之web服务器简单搭建
    今天说说如何搭建HTTP服务器!目的:使用“多IP地址”方法实现多个网站。使用“主机头名”方法实现多个网站。使用“多端口”方法实现多个网站。这回用图形界 ... [详细]
  • 1、为什么要对nginx平滑升级随着nginx越来越流行,并且nginx的优势也越来越明显,nginx的版本迭代也来时加速模式,1.9. ... [详细]
  • Linux是一套免费使用和***传播的类UNIX操作系统,主要用于基于Intel x86系列CPU的计算机上。Linux系统是由全世界各地的成千上万的程序员合适的方式定制自己的Li ... [详细]
  • 十一、构建我们自己的包在本章中,我们将学习如何构建自己的包。编写包可以让我们创建可以在许多应用 ... [详细]
  • 系统管理部分软件包管理进程管理服务管理磁盘管理系统管理之软件包管理软件包的安装方式yumapt方式rpmdpkg方式编译安装方式二进制安装方式rpm安装方式增删改查安装:-ivh查 ... [详细]
  • CAS介绍CAS(CentralAuthenticationService),是耶鲁大学开发的单点登录系统(SSO,singlesign-on),应用广泛,具有独立于平台的,易于理解,支持代 ... [详细]
  • YII框架basic和advanced项目模板的区别:功能 ... [详细]
  • 2019 年 Firebase 峰会上发布的新功能
    作者FrancisMa,HeadofProductFirebase的使命是帮助移动开发者和Web开发者迈向成功,但考虑到Firebase每个月有超过200万个活跃的应 ... [详细]
  • 正月十五后第一贴:网页设计素材倾情奉献(附下载源文件)
    昨晚通宵把本该年前完成的项目中,最后两模块搞完.浏览整个系统,可以用惨不忍睹来形容,功能上实现是没问题,不过,页面布局,美化等,就太差的忒多了.于是google之,找到的很少, ... [详细]
author-avatar
看破红尘红尘看破_728
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有