标题 | 基于Python内建库的分布式日志系统设计与实现 |
范文 | 秦子实
摘要:随着Python脚本在企业lT自动化运维中的逐步应用,脚本数量越来越多,功能覆盖也越来越广泛,在提高运维效率的同时,自动运维脚本的管理难度也逐步提高。因此,需要一套架构简单、易于编写、方便部署的分布式日志系统,对自动运维脚本的运行进行统一记录,以便进行调试或故障追溯。该文设计并实现了一种仅基于Python内建库即可部署的分布式日志系统,日志客户端与服务端仅需要极少的代码即可实现,具有库依赖关系简单、部署方便的特点,可以以较低的成本对现有运维脚本进行改造,以实现日志的集中管理。 关键词:分布式;日志系统;Python 中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2020)18-0082-02 开放科学(资源服务)标识码(OSID): 1 概述 Py thon語言因具有强大的表达能力、丰富的第三方库等特点,被广泛地应用于企业IT自动化运维体系中。Pthon通常以简单脚本的形式,存在于各个业务系统中,承担着诸如应用系统启停准备、数据备份管理、系统服务管理、系统版本管理、API管理等基础运维工作。脚本通常分散在各服务器的各应用系统中,种类繁多,维护人员也各不相同。而随着企业IT系统的增多,脚本数量也会随之增长,这种现象对企业运维管理、故障排查带来了较大的挑战。运维人员需要一种能够低成本改造现有脚本,同时也能够在今后编写的脚本中稳定应用的分布式日志记录系统。 基于该需求,本文设计并实现了一种仅使用Python内建库,基于内建socket库进行通信并使用内建logging库进行记录的简单分布式日志系统。 2 系统结构 鉴于低成本改造现有脚本的需要,本文采用PVthon默认的socketserver用作日志服务,通过默认logging模块的SocketH-andler进行分布式日志写入。采用logging.getLogger的name参数指定远端日志服务器中的特定logger进行记录,并利用name参数类似命名空间的分级特性,详细记录每条日志产生的服务器、所属服务、所在脚本及函数,用以区别各脚本产生的日志。 该架构在日志前端避免使用了消息队列等第三方系统,有效地控制了现有脚本的改造成本,此外,服务端利用Thread-ingTCPServer加速读取速度。该架构能够有效地将现有脚本的日志改造代码量控制在极小的范围内。 3 系统设计 3.1 日志服务端 分布式日志服务端采用Python内建的socketserver.Thread-ingTCPServer作为socket服务器。 利用socket上的select模型实现端口复用,使用非阻塞函数提升1/0效率。上文socketserver指定的读取socket的handler编写大致如下: 使用内建pickle模块载入读取的字节进行反序列化,之后通过makeLogRecord还原接收到的远端日志记录。之后,在服务端通过记录的name属性设置指定的logger,并记录日志信息。最后,根据需要在服务端配置各种logger,并使用serve—un-til_stopped启动服务即可。 例如客户端需要一个debug级别的logger,并希望handler按时间自动循环保存日志文件,logger可以按如下方式配置: 其指定的按时间自动循环保存文件的handler可以按如下方式配置: 如此,便可以方便地在客户端使用这个DebugLogger了。 3.2 日志客户端 为了降低现有脚本改造代价,客户端仅需要引入一个log-ger配置文件,或添加几行logger设置即可,按如下方式设置log-ger: 可以在配置文件中编写帮助函数,以方便各类不同脚本使用日志服务端。例如,在某使用多进程处理业务的脚本中,我们可以通过将进程ID写入logger的name属性来区别各个work-er的日志记录,该帮助函数可以编写为: 通过在脚本中引入该帮助函数返回的三个logger,便可以利用相应的logger将日志记录写入服务端。例如使用服务端名为“DebugLogger”的logger记录debug级别的日志:debugLogger.debug(f'... -些日志记录…')。 4 结束语 本文介绍了仅使用PYthon原生库搭建分布式日志服务的方法,使得对现有脚本的改造仅需要引入约十行代码,即可实现在日志服务器上写入日志的功能。该方法结构简单,性能优良,具备良好的可扩展性,后期可以通过改造服务端写入han-dler的方法进一步增强日志服务端的性能,是一种易开发、易部署、易维护的日志服务。 【通联编辑:梁书】 |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。