Python實(shí)現(xiàn)Logger打印功能的方法詳解
前言
眾所周知在Python中有專門(mén)用于logger打印的套件叫l(wèi)ogging,但是該套件logger僅接收一個(gè)字符串類(lèi)型的logger打印信息。因此,我們?cè)谑褂檬切枰忍崆皩⒁蛴〉男畔⑵唇映梢粋€(gè)字符串之后才行,這樣對(duì)于代碼的整潔性并不好。
我在logging的基礎(chǔ)上實(shí)現(xiàn)了一個(gè)類(lèi)似于Java的logback的logger打印工具,實(shí)現(xiàn)比較簡(jiǎn)單,能夠應(yīng)對(duì)一些簡(jiǎn)單的logger打印需求,希望對(duì)大家能有幫助。下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹:
LoggerFactory
該類(lèi)用作生成其他調(diào)用類(lèi)的logger實(shí)例,并保存這些實(shí)例。
''' Created on 2017年7月20日 Logger工廠,保存每個(gè)類(lèi)的Logger實(shí)例 ''' from slient.bigdata.common.logger import Logger import logging class LoggerFactory : LOG_FILENAME='bigdata_python.log' #logger保存文件 TYPE = "CONSOLE" #logger打印類(lèi)型 #TYPE = "FILE" LEVEL = logging.DEBUG #logger級(jí)別 #LEVEL = logging.INFO loggerDict = {} #對(duì)外部開(kāi)放的Logger調(diào)用方法 @staticmethod def getLogger(className) -> Logger: if className in LoggerFactory.loggerDict.keys() : logger = LoggerFactory.loggerDict[className] if not logger : logger = LoggerFactory.__initLogger(className) else : logger = LoggerFactory.__initLogger(className) return logger #生成Logger實(shí)例 @staticmethod def __initLogger(className) -> Logger: logger = logging.getLogger(className) # 設(shè)置logger的level為DEBUG logger.setLevel(LoggerFactory.LEVEL) #設(shè)置Logger格式 formatter = logging.Formatter('[%(asctime)s] [%(name)s] [%(levelname)s]: %(message)s') if LoggerFactory.TYPE == 'CONSOLE' : # 創(chuàng)建輸出日志到控制臺(tái)的StreamHandler handler = logging.StreamHandler() else : # 創(chuàng)建輸出日志到文件Handler handler = logging.FileHandler(LoggerFactory.LOG_FILENAME) #添加格式 handler.setFormatter(formatter) # 給logger添加上handler logger.addHandler(handler) localLogger = Logger(logger) LoggerFactory.loggerDict[className] = localLogger return localLogger
Logger
該類(lèi)主要實(shí)現(xiàn)了對(duì)logging的一些方法的封裝,比較簡(jiǎn)單。
''' Created on 2017年7月5日 日志處理 ''' import logging import string class Logger : def __init__(self, logger : logging): self.logger = logger def info(self, formatStr:string, *objs): self.logger.info(formatStr.format(*objs)) def debug(self, formatStr:string, *objs): self.logger.debug(formatStr.format(*objs)) def error(self, formatStr:string, *objs): self.logger.error(formatStr.format(*objs))
測(cè)試
logger = LoggerFactory.getLogger("Test") logger.info("打印log1:{}, 打印log2:{}", 666, "我是log2")
測(cè)試結(jié)果:
[2017-07-20 16:43:00,821] [Test] [INFO]: 打印log1:666, 打印log2:我是log2
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Python報(bào)錯(cuò)ImportError:?IProgress?not?found.?Please?update
在使用Jupyter Notebook或JupyterLab進(jìn)行交互式編程時(shí),我們可能會(huì)遇到各種導(dǎo)入錯(cuò)誤,本文就來(lái)介紹一下Python報(bào)錯(cuò)ImportError:?IProgress?not?found.?Please?update?jupyter?and?ipywidgets解決,感興趣的可以了解一下2024-06-06python中format()函數(shù)的簡(jiǎn)單使用教程
python中format函數(shù)用于字符串的格式化,接下來(lái)通過(guò)本文給大家介紹python中format()函數(shù)的簡(jiǎn)單使用教程,一起看看吧2018-03-03CNN的Pytorch實(shí)現(xiàn)(LeNet)
本文主要從CNN的Pytorch實(shí)現(xiàn)庫(kù)導(dǎo)入,模型定義,數(shù)據(jù)加載、處理,模型訓(xùn)練,代碼匯總等方面入手介紹,運(yùn)用代碼講解相關(guān)內(nèi)容非常的詳細(xì),大家如果有需要了解相關(guān)知識(shí)的可以參考這篇文章2021-09-09Pycharm遠(yuǎn)程連接服務(wù)器并運(yùn)行與調(diào)試
本篇文章介紹一下 Pycharm 如何配置遠(yuǎn)程連接信息,使其能夠在本地使用服務(wù)器上的GPU等硬件資源,并在本地完成代碼的運(yùn)行與調(diào)試,感興趣的可以了解一下2021-08-08python射線法判斷檢測(cè)點(diǎn)是否位于區(qū)域外接矩形內(nèi)
這篇文章主要為大家詳細(xì)介紹了python射線法判斷檢測(cè)點(diǎn)是否位于區(qū)域外接矩形內(nèi),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06Python用requests-html爬取網(wǎng)頁(yè)的實(shí)現(xiàn)
本文主要介紹了Python用requests-html爬取網(wǎng)頁(yè)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Python讀取xlsx數(shù)據(jù)生成圖標(biāo)代碼實(shí)例
這篇文章主要介紹了Python讀取xlsx數(shù)據(jù)生成圖標(biāo)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Python中ModuleNotFoundError錯(cuò)誤的問(wèn)題解決
本文主要介紹了Python中ModuleNotFoundError錯(cuò)誤的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02