標籤:color art method 簡介 strftime 標準輸出 查看 basic 函數
1 logging模組簡介
logging模組是Python內建的標準模組,主要用於輸出作業記錄,可以設定輸出日誌的等級、日誌儲存路徑、記錄檔復原等;相比print,具備如下優點:
- 可以通過設定不同的日誌等級,在release版本中只輸出重要訊息,而不必顯示大量的調試資訊;
- print將所有資訊都輸出到標準輸出中,嚴重影響開發人員從標準輸出中查看其它資料;logging則可以由開發人員決定將資訊輸出到什麼地方,以及怎麼輸出;
2 logging模組使用2.1 基本使用
配置logging基本的設定,然後在控制台輸出日誌,
1 import logging2 logging.basicConfig(level = logging.INFO,format = ‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)3 logger = logging.getLogger(__name__)4 5 logger.info("Start print log")6 logger.debug("Do something")7 logger.warning("Something maybe fail.")8 logger.info("Finish")
logging中可以選擇很多訊息層級,如debug、info、warning、error以及critical。通過賦予logger或者handler不同的層級,開發人員就可以只輸出錯誤資訊到特定的記錄檔案,或者在調試時只記錄調試資訊。
logging.basicConfig函數各參數:
filename:指定記錄檔名;
filemode:和file函數意義相同,指定記錄檔的開啟模式,‘w‘或者‘a‘;
format:指定輸出的格式和內容,format可以輸出很多有用的資訊,
參數:作用
%(levelno)s:列印記錄層級的數值
%(levelname)s:列印記錄層級的名稱
%(pathname)s:列印當前執行程式的路徑,其實就是sys.argv[0]
%(filename)s:列印當前執行程式名
%(funcName)s:列印日誌的當前函數
%(lineno)d:列印日誌的當前行號
%(asctime)s:列印日誌的時間
%(thread)d:列印線程ID
%(threadName)s:列印線程名稱
%(process)d:列印進程ID
%(message)s:列印日誌資訊
datefmt:指定時間格式,同time.strftime();
level:設定記錄層級,預設為logging.WARNNING;
stream:指定將日誌的輸出資料流,可以指定輸出到sys.stderr,sys.stdout或者檔案,預設輸出到sys.stderr,當stream和filename同時指定時,stream被忽略;
2.2 將日誌寫入到檔案
2.2.1 將日誌寫入到檔案
設定logging,建立一個FileHandler,並對輸出訊息的格式進行設定,將其添加到logger,然後將日誌寫入到指定的檔案中
1 import logging 2 logger = logging.getLogger(__name__) 3 logger.setLevel(level = logging.INFO) 4 handler = logging.FileHandler("log.txt") 5 handler.setLevel(logging.INFO) 6 formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘) 7 handler.setFormatter(formatter) 8 logger.addHandler(handler) 9 10 logger.info("Start print log")11 logger.debug("Do something")12 logger.warning("Something maybe fail.")13 logger.info("Finish")
下面是封裝的一個 日誌列印助手:
1 import logging.handlers 2 3 """ 4 %(levelno)s: 列印記錄層級的數值 5 %(levelname)s: 列印記錄層級名稱 6 %(pathname)s: 列印當前執行程式的路徑,其實就是sys.argv[0] 7 %(filename)s: 列印當前執行程式名 8 %(funcName)s: 列印日誌的當前函數 9 %(lineno)d: 列印日誌的當前行號10 %(asctime)s: 列印日誌的時間11 %(thread)d: 列印線程ID12 %(threadName)s: 列印線程名稱13 %(process)d: 列印進程ID14 %(message)s: 列印日誌資訊15 """16 17 class LogAssistant:18 logger = None19 # 日誌一共分成5個等級,從低到高分別是:DEBUG INFO WARNING ERROR CRITICAL。這5個等級,也分別對應5種打日誌的方法: debug 、info 、warning 、error 、critical。預設的是WARNING,20 21 levels = {"d": logging.DEBUG,22 "i": logging.INFO,23 "w": logging.WARNING,24 "e": logging.ERROR,25 "c": logging.CRITICAL}26 27 log_level = "d"28 log_file = "log.txt"29 log_max_byte = 10 * 1024 * 1024;30 log_backup_count = 531 32 @staticmethod33 def getLogger():34 if LogAssistant.logger is not None:35 return LogAssistant.logger36 37 LogAssistant.logger = logging.Logger("LogAssistant")38 log_handler = logging.handlers.RotatingFileHandler(filename=LogAssistant.log_file, 39 maxBytes=LogAssistant.log_max_byte, 40 backupCount=LogAssistant.log_backup_count)41 log_fmt = logging.Formatter("[%(asctime)s][%(levelname)s][func:%(funcName)s][thread:%(thread)d]: %(message)s")42 log_handler.setFormatter(log_fmt)43 LogAssistant.logger.addHandler(log_handler)44 LogAssistant.logger.setLevel(LogAssistant.levels.get(LogAssistant.log_level))45 return LogAssistant.logger46 47 def output_test():48 logger = LogAssistant.getLogger()49 logger.debug("this is a debug msg!")50 51 if __name__ == "__main__":52 output_test()
Python 日誌列印模組