1. 程式人生 > >python 日誌模組logging學習與使用(日誌分割)

python 日誌模組logging學習與使用(日誌分割)

python中用於日誌建立、設定和記錄等功能的模組,就是logging了,下面是對其基本使用方法的介紹:

一、最最簡單的使用方法:

import logging LOG_FILE ="/opt/xxx/log/debug.log" logging.basicConfig(filename=LOG_FILE,level=logging.DEBUG)

然後在需要記錄日誌的地方引用:

logging.warn("[WARN:%s]warn messages %s",error_code,error_msg)

簡單的幾行程式碼,就可以實現將“[WARN:14001]warn message Error request”寫入日誌檔案/opt/xxx/log/debug.log中了。

二、再來比較正規的使用方式:

#!/usr/bin/python

def initlog(): import logging # 生成一個日誌物件 logger = logging.getLogger() # 生成一個Handler。logging支援許多Handler,例如FileHandler, SocketHandler, SMTPHandler等,

# 我由於要寫檔案就使用了FileHandler。 # LOG_FILE是一個全域性變數,它就是一個檔名,如:'crawl.log' LOG_FILE ="/opt/xxx/log/debug.log" hdlr = logging.FileHandler(LOG_FILE) # 生成一個格式器,用於規範日誌的輸出格式。如果沒有這行程式碼,那麼預設的

# 格式就是:"%(message)s"。也就是寫日誌時,資訊是什麼日誌中就是什麼, # 沒有日期,沒有資訊級別等資訊。logging支援許多種替換值,詳細請看 # Formatter的文件說明。這裡有三項:時間,資訊級別,日誌資訊 formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') # 將格式器設定到處理器上 hdlr.setFormatter(formatter) # 將處理器加到日誌物件上 logger.addHandler(hdlr) # 設定日誌資訊輸出的級別。logging提供多種級別的日誌資訊,如:NOTSET,
# DEBUG, INFO, WARNING, ERROR, CRITICAL等。每個級別都對應一個數值。 # 如果不執行此句,預設為30(WARNING)。可以執行:logging.getLevelName # (logger.getEffectiveLevel())來檢視預設的日誌級別。日誌物件對於不同 # 的級別資訊提供不同的函式進行輸出,如:info(), error(), debug()等。當 # 寫入日誌時,小於指定級別的資訊將被忽略。因此為了輸出想要的日誌級別一定 # 要設定好此引數。這裡我設為NOTSET(值為0),也就是想輸出所有資訊 logger.setLevel(logging.NOTSET) return logger logging = initlog() logging.info(' 註冊') logging.error('error!') logging.debug('debug')

上面程式碼中的使用方式,可以指定日誌的級別和格式,可用於區分開發環境和使用者環境中日誌的級別,減少不必要的空間浪費。
三、日誌分割
當工程執行一段時間後,會發現日誌檔案越來越大,而且也不便於查詢某天的錯誤資訊。這就需要我們對日誌進行分割,分割形式有兩種:RotatingFileHandler(按照檔案大小分割)、TimedRotatingFileHandler(按照時間間隔分割)
  • 以第二個例子中的程式碼為基礎,按照檔案大小分割的使用方法:

hdlr = logging.handlers.RotatingFileHandler(LOG_FILE,maxBytes=1024*1024,backupCount=40)

其中maxBytes指定每個日誌檔案的大小,如果檔案超過1024KB就分割該日誌檔案,最大的備份檔案個數是40個。到LOG_FILE所在目錄下檢視,發現除了debug.log檔案外,還多了debug.log.1,debug.log.2等檔案。

debug.log檔案和debug.log.1等檔案的關係是:debug.log是全集,debug.log.1和debug.log.2等檔案是無交集的屬於debug.log的子集(忘記數學符號怎麼寫了,感覺文字木有表示式明瞭啊)
  • 同樣以第二個例子中的程式碼為基礎,按照時間間隔分割的使用方法:
hdlr = logging.handlers.TimedRotatingFileHandler(LOG_FILE,when='M',interval=1,backupCount=40)
when引數可設定為S-second(按秒對日誌進行分割),M-Minutes(按分鐘對日誌進行分割),H-Hours(按小時對日誌進行分割),D-Days(按天對日誌進行分割),midnigh-roll over at midnight(每天半夜對日誌進行回滾),W{0-6}-roll over on a certain day;0-Monday(按照指定的日期如0-週一對日誌進行回滾)。when引數預設是“h”按小時分割,該引數對大小寫不敏感,所以無所謂是H還是h了。
interval引數預設“1”,如果when=‘h’,那麼就是每一小時對日誌進行一次分割,即debug.log所在目錄會出現 debug.log.2013-06-28_13,debug.log.2013-06-28_14等日誌檔案。