秦子實



摘要:隨著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的方法進一步增強日志服務端的性能,是一種易開發、易部署、易維護的日志服務。
【通聯編輯:梁書】