日志采集
随着互联网的发展,网络基础设置的改善,人们对于网络应用提出了更高的要求,于是各大互联网公司纷纷采用分布式架构以支持越来越高的并发量。由分布式架构引出来的日志问题也越来越突出。在单机环境下可以正常使用的日志解决方案在分布式环境下表现的有心无力。因此本系统的目的在于提供一个更加友好的日志采集和存储方案。
本文分几部分阐述了基于Java开发,涉及消息中间件,socket短连接等技术的日志采集系统的结构和设计实现过程,实现了日志发送、日志存储、日志备份、日志实时浏览等功能。支持横向扩展,可以轻松实现分布式部署。同时充分考虑了宕机情况的出现,尽可能地保证系统核心功能的正常运行。
根据本文设计思路,最终开发出一个健壮、稳定的日志采集系统。
概述
原理
软件客户端发送日志消息到消息中间件,采集模块从消息中间件中拿取数据,存入时序数据库,并且定时备份日志文件到本地文件系统,同时利用WebSocket等技术实现日志的实时浏览。
功能
日志发送
软件客户端通过本系统提供的工具发送日志消息到指定的消息中间件,且在一定程度上保证有序。
日志收集
本系统通过监听消息中间件,即使拿取日志消息,并且按照一定的规则进行持久化存储。
服务监控
本系统提供Web模块以监控采集模块以及相关服务运行状况。
日志备份
本系统可以定期将日志持久化到文件,存储在本地文件系统。同时提供相应的下载接口
实时日志浏览
本系统提供接口以实时查看消息中间件接收到的日志消息,同时支持简单的规则过滤,并保证在一定程度下日志消息有序,以便开发人员调试。
宕机记录
可通过本系统查看相应日志生产者宕机情况
环境
涉及到的环境
- jdk1.8+
- ActiveMq
- Influxdb
设计
架构


client
供日志产生端使用的工具模块。思路为自定义日志组件消息通道,目前支持log4j框架;以及直接读入程序日志文件。该模块需要对现有Java项目进行一定程序的修改。
MQ
消息中间件依赖。用于中转日志以及服务状态监控等数据通信领域。
Server
日志采集模块。负责监听消息中间件,将日志消息持久化到TSDB,同时负责按照一定的周期备份日志文件到本地文件系统或其他存储系统。
该模块支持横向扩展,只需要多台机器保持消息中间件等相关配置一致即可。
WEB
图形化界面模块。B/S架构。该模块以Web界面方式提供监控Server模块状态、日志文件下载、系统报警和实时日志浏览等功能。
该模块非必需模块,缺失或宕机不影响日志采集存储功能。
TSDB
时序数据库。用于临时存储日志消息,以解决使用消息中间件通讯中由于网络抖动等原因导致的顺序错位。
通信方案
本系统使用了四种通信方式
- JMS——主要用于Client-MQ-Server。
- HTTP协议——Web模块对用户提供服务。
- Socket——Web和Server直接通信,主要用于文件传输。
- WebSocket——用于Web模块浏览实时日志



可行性分析
解释部分设计原理和难点解决方案
日志发送方式
引入消息中间件作为通信桥梁,使用队列模式
优点
- 日志生产者和消费者解耦
- 日志消费者可以横向扩展
缺点
- 日志消费者无法保证日志有序
Java程序如何接入
- 如果是基于slf4j的程序,只需要引入一个appender,修改日志配置即可
- 或者基于文件监控,需要在服务器上额外部署一个服务(不推荐)
如何保证日志有序
引入时序数据库,日志消费者将从中间件获取的日志存储到时序数据库,由时序数据库负责排序和临时存储。消费者再每隔一段时间从数据库获取数据,依次保证在这段时间间隔内的日志尽可能有序。
如何实现日志实时浏览
- 日志消费者在从queue中获取数据后,再以topic形式发送出去
- Web模块订阅topic,一旦接收到日志消息,则以WebSocket方式进行广播
- 前端通过WebSocket和后端进行全双工通信
如何降低耦合
耦合来源
- 消息中间件
- 时序数据库
解决方案
使用设计模式实现相关实现的可替换。可参考slf4j不同日志输出组件的原理
健壮性分析
- 消息中间件
消息中间件宕机将会影响Client发送日志,此时Client需要将日志缓存到本地,等待消息中间件恢复之后将日志消息重新发送。
- Client
Client宕机即代表终端服务宕机,此时不会产生日志,且终端服务宕机应该有另外的报警方案,不在本系统设计考虑范围内。
- Server
Server支持横向扩展,单一机器宕机只会影响日志采集效率,不会导致系统全线崩溃。
- Web
该模块为非必需模块,宕机不会影响日志采集功能,因此不在考虑范围内;建议使用额外的方案以监听该模块状态,例如定时发送HTTP请求即可判断模块运行状态。
- TSDB
时序数据库宕机将会导致Server无法持久化,此时Server将会把采集到的日志返还到消息中间件,不采用缓存方案,防止此时Server宕机导致缓存的日志丢失。
实现
数据库设计



源码
本系统已托管在github,项目地址为:https://github.com/inkroom/log-colleage/