標籤:相關 tco ati png col 一個 設定 class 替換
Python的logging模組Logging的基本資料:
l 預設的情況下python的logging模組列印到控制台,只顯示大於等於warning層級的日誌
l 記錄層級:critical > error > warning > info > debug > notset
Logging的基本組件:1. logger
l logger是一個樹形層級結構,輸出資訊之前都要獲得一個logger
l logger = logging.getLogger() 返回一個預設的logger也即rootLogger,並應用預設的記錄層級,即只有日誌等級大於等於warning層級的資訊輸出
l 也可以通過logger.setLevel(lel)指定最低的記錄層級,可用的記錄層級有:
l logging.DEBUG,logging.INFO,Logging.ERROR,logging.CRITICAL;logger.debug(),logger.info().logger.warning(),logger.error(),logger.critical()
2. handler
l handler對象負責發送相關的資訊到指定目的地
l handler.setlevel(lel):指定記錄層級,低於lel層級的日誌將被忽略
l handler.setFormatter():給handler選擇一個Formatter
l logging.StreamHandler 可以向類似與sys.stdout或者sys.stderr的任何檔案對象(file object)輸出資訊
l logging.FileHander 用於向一個檔案輸出日誌資訊
l logging.handlers.RotatingFileHandler 類似於上面的FileHandler,但是它可以管理檔案大小,當檔案達到一定大小之後,它會自動將當前記錄檔改名,然後建立一個新的同名記錄檔繼續輸出
l logging.handlers.TimeRotatingFileHandler和RotatingFileHandler類似,不過它沒有通過判斷檔案大小來決定何時重新建立記錄檔,而是間隔一定時間就自動建立新的記錄檔
Formatter
l formatter對象設定日誌資訊最後的規則,結構和內容,預設的時間格式為%Y-%m-%d %H:%M:%S
Filter
l filter:限制只有滿足過濾規則的日誌才會輸出
l 比如定義了filter = logging.Filter(‘jiyanjiao’),並將這個Filter添加到一個Handler上,則使用該handler的Logger中只有名字帶’jiyanjiao’首碼的logger才能輸出其日誌
下面就來說一下具體的應用吧
l 需求是這樣的:想列印自己的log,因為使用print每次都需要編輯替換覺得很麻煩,想讓自己的程式更加正規些,也想區分不同層級log的顏色所以寫下了如下的代碼
import loggingimport ctypes‘‘‘ 定義顏色記錄層級顏色變數: ‘‘‘FOREGROUND_WHITE = 0x0007FOREGROUND_BLUE = 0x01FOREGROUND_GREEN = 0x02FOREGROUND_RED = 0x04FOREGROUND_YELLOW = FOREGROUND_RED | FOREGROUND_GREENSTD_OUTPUT_HANDLE = -11std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)def set_color(color, handle=std_out_handle): bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color) return boolclass mylogger(object): def __init__(self,name=‘mylogger‘): self.logger = logging.getLogger(name) self.init_logger() ‘‘‘ 建立一個file_handler,用於寫入記錄檔 再建立一個stream_handler,用於輸出到控制台 定義handler的輸出格式formatter %(asctime)s 字串形式的目前時間。預設格式是 “2003-07-08 16:49:45,896”。逗號後面的是毫秒 %(name)s Logger的名字 %(levelname)s 文本形式的記錄層級 %(message)s 使用者輸出的訊息 ‘‘‘ def init_logger(self): self.logger.setLevel(logging.DEBUG) file_handler = logging.FileHandler(‘D:/tmp/test.log‘) stream_handler = logging.StreamHandler() formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘) file_handler.setFormatter(formatter) stream_handler.setFormatter(formatter) self.logger.addHandler(file_handler) self.logger.addHandler(stream_handler) def debug(self,message,color=FOREGROUND_BLUE): set_color(color) self.logger.debug(message) set_color(FOREGROUND_WHITE) def info(self, message, color=FOREGROUND_GREEN): set_color(color) self.logger.info(message) set_color(FOREGROUND_WHITE) def warn(self,message,color=FOREGROUND_YELLOW): set_color(color) self.logger.warn(message) set_color(FOREGROUND_WHITE) def error(self, message,color=FOREGROUND_RED): set_color(color) self.logger.error(message) set_color(FOREGROUND_WHITE) def critical(self,message,color=FOREGROUND_RED): set_color(color) self.logger.critical(message) set_color(FOREGROUND_WHITE)if __name__ == ‘__main__‘: mylogger = mylogger() mylogger.debug(‘這是debug資訊‘) mylogger.info(‘這是info資訊‘) mylogger.warn(‘這是warning‘) mylogger.error(‘這是error資訊‘) mylogger.critical(‘這是critical資訊‘)
列印的結果:
那麼可能有同學就有疑問了那麼ctypes是什麼
l Ctypes是python的一個外部庫,提供和c語言相容的資料類型,可以很方便的調用C DLL中的函數
python中的logging模組學習