秦子實(shí)
摘要:隨著Python腳本在企業(yè)lT自動化運(yùn)維中的逐步應(yīng)用,腳本數(shù)量越來越多,功能覆蓋也越來越廣泛,在提高運(yùn)維效率的同時,自動運(yùn)維腳本的管理難度也逐步提高。因此,需要一套架構(gòu)簡單、易于編寫、方便部署的分布式日志系統(tǒng),對自動運(yùn)維腳本的運(yùn)行進(jìn)行統(tǒng)一記錄,以便進(jìn)行調(diào)試或故障追溯。該文設(shè)計(jì)并實(shí)現(xiàn)了一種僅基于Python內(nèi)建庫即可部署的分布式日志系統(tǒng),日志客戶端與服務(wù)端僅需要極少的代碼即可實(shí)現(xiàn),具有庫依賴關(guān)系簡單、部署方便的特點(diǎn),可以以較低的成本對現(xiàn)有運(yùn)維腳本進(jìn)行改造,以實(shí)現(xiàn)日志的集中管理。
關(guān)鍵詞:分布式;日志系統(tǒng);Python
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2020)18-0082-02
開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID):
1 概述
Py thon語言因具有強(qiáng)大的表達(dá)能力、豐富的第三方庫等特點(diǎn),被廣泛地應(yīng)用于企業(yè)IT自動化運(yùn)維體系中。Pthon通常以簡單腳本的形式,存在于各個業(yè)務(wù)系統(tǒng)中,承擔(dān)著諸如應(yīng)用系統(tǒng)啟停準(zhǔn)備、數(shù)據(jù)備份管理、系統(tǒng)服務(wù)管理、系統(tǒng)版本管理、API管理等基礎(chǔ)運(yùn)維工作。腳本通常分散在各服務(wù)器的各應(yīng)用系統(tǒng)中,種類繁多,維護(hù)人員也各不相同。而隨著企業(yè)IT系統(tǒng)的增多,腳本數(shù)量也會隨之增長,這種現(xiàn)象對企業(yè)運(yùn)維管理、故障排查帶來了較大的挑戰(zhàn)。運(yùn)維人員需要一種能夠低成本改造現(xiàn)有腳本,同時也能夠在今后編寫的腳本中穩(wěn)定應(yīng)用的分布式日志記錄系統(tǒng)。
基于該需求,本文設(shè)計(jì)并實(shí)現(xiàn)了一種僅使用Python內(nèi)建庫,基于內(nèi)建socket庫進(jìn)行通信并使用內(nèi)建logging庫進(jìn)行記錄的簡單分布式日志系統(tǒng)。
2 系統(tǒng)結(jié)構(gòu)
鑒于低成本改造現(xiàn)有腳本的需要,本文采用PVthon默認(rèn)的socketserver用作日志服務(wù),通過默認(rèn)logging模塊的SocketH-andler進(jìn)行分布式日志寫入。采用logging.getLogger的name參數(shù)指定遠(yuǎn)端日志服務(wù)器中的特定logger進(jìn)行記錄,并利用name參數(shù)類似命名空間的分級特性,詳細(xì)記錄每條日志產(chǎn)生的服務(wù)器、所屬服務(wù)、所在腳本及函數(shù),用以區(qū)別各腳本產(chǎn)生的日志。
該架構(gòu)在日志前端避免使用了消息隊(duì)列等第三方系統(tǒng),有效地控制了現(xiàn)有腳本的改造成本,此外,服務(wù)端利用Thread-ingTCPServer加速讀取速度。該架構(gòu)能夠有效地將現(xiàn)有腳本的日志改造代碼量控制在極小的范圍內(nèi)。
3 系統(tǒng)設(shè)計(jì)
3.1 日志服務(wù)端
分布式日志服務(wù)端采用Python內(nèi)建的socketserver.Thread-ingTCPServer作為socket服務(wù)器。
利用socket上的select模型實(shí)現(xiàn)端口復(fù)用,使用非阻塞函數(shù)提升1/0效率。上文socketserver指定的讀取socket的handler編寫大致如下:
使用內(nèi)建pickle模塊載入讀取的字節(jié)進(jìn)行反序列化,之后通過makeLogRecord還原接收到的遠(yuǎn)端日志記錄。之后,在服務(wù)端通過記錄的name屬性設(shè)置指定的logger,并記錄日志信息。最后,根據(jù)需要在服務(wù)端配置各種logger,并使用serve—un-til_stopped啟動服務(wù)即可。
例如客戶端需要一個debug級別的logger,并希望handler按時間自動循環(huán)保存日志文件,logger可以按如下方式配置:
其指定的按時間自動循環(huán)保存文件的handler可以按如下方式配置:
如此,便可以方便地在客戶端使用這個DebugLogger了。
3.2 日志客戶端
為了降低現(xiàn)有腳本改造代價(jià),客戶端僅需要引入一個log-ger配置文件,或添加幾行l(wèi)ogger設(shè)置即可,按如下方式設(shè)置log-ger:
可以在配置文件中編寫幫助函數(shù),以方便各類不同腳本使用日志服務(wù)端。例如,在某使用多進(jìn)程處理業(yè)務(wù)的腳本中,我們可以通過將進(jìn)程ID寫入logger的name屬性來區(qū)別各個work-er的日志記錄,該幫助函數(shù)可以編寫為:
通過在腳本中引入該幫助函數(shù)返回的三個logger,便可以利用相應(yīng)的logger將日志記錄寫入服務(wù)端。例如使用服務(wù)端名為“DebugLogger”的logger記錄debug級別的日志:debugLogger.debug(f'... -些日志記錄…')。
4 結(jié)束語
本文介紹了僅使用PYthon原生庫搭建分布式日志服務(wù)的方法,使得對現(xiàn)有腳本的改造僅需要引入約十行代碼,即可實(shí)現(xiàn)在日志服務(wù)器上寫入日志的功能。該方法結(jié)構(gòu)簡單,性能優(yōu)良,具備良好的可擴(kuò)展性,后期可以通過改造服務(wù)端寫入han-dler的方法進(jìn)一步增強(qiáng)日志服務(wù)端的性能,是一種易開發(fā)、易部署、易維護(hù)的日志服務(wù)。
【通聯(lián)編輯:梁書】