前面的博客中对日志收集系统已做了描述,这篇博客主要是日志收集系统代码层面的实现:
首先来回顾分析我们的日志收集系统:
一、项目需求
1. 收集配置文件中指定的日志文件内容,同时可以实时查看分析日志内容?
2. 可以动态修改要收集的日志文件?
3. 可以随时启停正在收集的日志文件?
二、项目分析
整体的系统架构图如下:
将整个的架构分为四层:LogAgent层, Transfer层,Web层, 大数据分析层。
1. LogAgent层
这一层主要的实现目标是将服务器上要收集的日志按照topic(一个日志文件对应一个topic,这样为了易于管理,比如随时删除或者启停该日志的收集而不影响其他路径的日志收集)发送到kafka中,同时需要监控并处理来自Web层日志路径的变化,实时更新要收集的日志文件。
要收集的日志路径有两个来源:
(1)在项目启动时,配置文件中配置需要收集的日志;
(2)Web层动态的的修改要收集的日志文件。
Web层与LogAgent层的交互是通过etcd,为了区分多台服务器上的日志收集,使用每台机器上的IP并拼接特定的前缀作为唯一的etcd ke,key中的value就是要收集的日志(是一个结构体数组),可以一台机器上的多个路径下的日志文件。下面例子为保存在etcd中的内容:
key: /logAgen/192.168.0.1 value:[{"path":"D:/project/nginx/logs/access2.log","topic":"nginx_log"},{"path":"D:/project/nginx/logs/error2.log","topic":"nginx_log_err"}]
2. Transfer层
该层是将来kafka中的数据按照topic取出发送到es中,通过kibana来实现日志数据的保存及可视化分析,该层的数据两个来源:
(1)通过读取配置文件,按照topic消费来自kafka的日志信息;
(2)Web层更改日志收集的文件,要随时添加到要收集的队列中。
3. Web层
通过该层可以动态的修改日志收集文件及展示收集的日志文件信息。
4. 大数据分析层
该层暂未实现,后面有时间会做相关的学习研究。
三、代码实现
见github:https://github.com/XJL635438451/logCollectProject
代码存在bug:
没有实现项目需求中的3,同时代码存在耦合,重复代码较多,后面会进行重构。