看過還不錯,準系統都講到了。
下面把它的使用代碼寫出來,很簡單:
1 def initlog():
2 import logging
3
4 logger = logging.getLogger()
5 hdlr = logging.FileHandler(logfile)
6 formatter = logging.Formatter(‘%(asctime)s %(levelname)s %(message)s’)
7 hdlr.setFormatter(formatter)
8 logger.addHandler(hdlr)
9 logger.setLevel(logging.NOTSET)
10
11 return logger
這個函數用來返回一個日誌對象。
第4行產生一個日誌對象,可以帶一個名字,可以預設。(註:這裡的名字是日誌類的名字,用於標識這個logger類)
第5行產生一個Handler。logging支援許多Handler,象FileHandler, SocketHandler, SMTPHandler等,我由於要寫檔案就使用了FileHandler。logfile是一個全域變數,它就是一個檔案名稱,如:’crawl.log’。
第6行產生一個格式器,用於規範日誌的輸出格式。如果沒有這行代碼,那麼預設的格式就是:”%(message)s”。也就是寫日誌時,資訊是什麼日誌中就是什麼,沒有日期,沒有資訊層級等資訊。logging支援許多種替換值,詳細請看Formatter的文檔說明。這裡有三項:時間,資訊層級,日誌資訊。(比較常用就著三項)
第7行將格式器設定到處理器上。
第8行將處理器加到日誌對象上。
第9行設定日誌資訊輸出的層級。logging提供多種層級的日誌資訊,如:NOTSET, DEBUG, INFO, WARNING, ERROR, CRITICAL等。每個層級都對應一個數值。如果不執行此句,預設為30(WARNING)。可以執行:logging.getLevelName(logger.getEffectiveLevel())來查看預設的記錄層級。日誌對象對於不同的層級資訊提供不同的函數進行輸出,如:info(), error(), debug()等。當寫入日誌時,小於指定層級的資訊將被忽略。因此為了輸出想要的記錄層級一定要設定好此參數。這裡我設為NOTSET(值為0),也就是想輸出所有資訊。
有了日誌對象,輸出就非常簡單了:
有以下幾種的level
logger.error(message)
logger.info(message)
logger.warning(msg)
logger.critical(msg)
logger.exception(msg)
logger.log(msg)
def initlog(): import logging logger = logging.getLogger('LoggerE18') hdlr = logging.FileHandler("D:\Euler\E18\Log.txt", "w") # Write mode formatter = logging.Formatter('%(asctime)s, %(levelname)s, %(message)s') hdlr.setFormatter(formatter) logger.addHandler(hdlr) logger.setLevel(logging.DEBUG) return loggerimport iologger = initlog()logger.info("logger name is '" + logger.name + "'")f = open("D:\Euler\E18\Data.txt", "r")logger.info("Open file")data = f.readlines()logger.info("Get data")f.close()logger.debug(data)for i in range(0, len(data)-1): data[i] = data[i].strip()logger.debug(data)
這裡的日誌採用W模式,唯寫模式,這樣就不用追加導致日誌增大的麻煩。 setLevel一定要注意不要用NOTSET,那種的是寫不進去的,會什麼日誌都寫不了。就用DEBUG 就好。
logger類的關閉要採用logging.shutdown()方法來關閉。