Go日志实时收集系统
架构图设计:
背景
数据库希望结合深度学习,将数据进行训练,然后给用户提供数据优化建议。数据库本身的日志已经很多了,在业务更加复杂,模块更多的时候,日志的收集已经易读性显得更加的重要。这种情况我们应该将各个模块和业务线的日志进行实时的收集,然后提供展示和搜索。
问题
1.日志量可能会非常的大
2.日志需要实时收集,但可以是弱一致性,保证最终一致性
3.可以灵活的不停机添加或删除模块和业务线的日志
4.日志需要设计好结构体,方便映射和存储到es,例如需要包括模块名,日志消息内容,日志级别等
架构分析
配置文件
首先架构用到了kafka,etcd,es,influxDB等组件,这些组件的配置可以写在一个ini配置文件里,通过go-ini映射获取。
日志收集项配置
1.我们将需要收集哪些日志文件的路径,kafka-topic以json的形式注册在etcd
2.同时我们起一个goroutine放置一个etcd-watcher监控这个日志配置项,如果日志配置项发生改变(新增,删除),通知系统
tail
1.我们使用tail包进行日志文件的监控,每当日志文件有新的日志追加,就可以通过tail读取到,然后发送到msg channel1,进行一个异步的处理
2.每个需要收集的日志文件,都会起一个对应的goroutine去监控
3.当收到etcd-watcher的通知,日志收集项配置发生变化时候,根据具体的变化,对应的去停止或启动tail goroutine
kafka
1.kafka去msg channel2读取tail生产的消息
2.kafka会持久化收到的消息
3.kafka将消息发送到msg channel2给es消费
es
1.消费kafka发送到msg channel2的消息
2.将受到的日志存储到es
kibana
可视化的去展示和搜索各个模块的日志消息
gopsutil
1.作为一个后台展示的系统,可以添加一个系统信息监控的模块。gopsutil是psutil的go版本,可以方便的获取系统的cpu,内存,磁盘,网络等信息。
2.获取到系统信息后,发送到influxDB
influxDB
influxDB作为时序数据库非常适合作为监控数据的存储
granfana
granfana可以选择influxDB作为Data Source,使用可视化的图标,去方便的展示系统信息