1. 程式人生 > >Python 日誌打印模塊

Python 日誌打印模塊

模塊使用 標準輸出 文件 RoCE info ini 出錯 method his

1 logging模塊簡介

logging模塊是Python內置的標準模塊,主要用於輸出運行日誌,可以設置輸出日誌的等級、日誌保存路徑、日誌文件回滾等;相比print,具備如下優點:

  1. 可以通過設置不同的日誌等級,在release版本中只輸出重要信息,而不必顯示大量的調試信息;
  2. print將所有信息都輸出到標準輸出中,嚴重影響開發者從標準輸出中查看其它數據;logging則可以由開發者決定將信息輸出到什麽地方,以及怎麽輸出;

2 logging模塊使用

2.1 基本使用

配置logging基本的設置,然後在控制臺輸出日誌,

1 import logging
2 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: 打印線程ID
12  %(threadName)s: 打印線程名稱
13  %(process)d: 打印進程ID
14  %(message)s: 打印日誌信息
15 """
16 
17 class LogAssistant:
18     logger = None
19     # 日誌一共分成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 = 5
31 
32     @staticmethod
33     def getLogger():
34         if LogAssistant.logger is not None:
35             return LogAssistant.logger
36 
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.logger
46 
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 日誌打印模塊