python 日誌模組logging學習與使用(日誌分割)
阿新 • • 發佈:2019-01-06
python中用於日誌建立、設定和記錄等功能的模組,就是logging了,下面是對其基本使用方法的介紹:
一、最最簡單的使用方法:
二、再來比較正規的使用方式:
def initlog():
import logging
# 生成一個日誌物件
logger = logging.getLogger()
# 生成一個Handler。logging支援許多Handler,例如FileHandler, SocketHandler, SMTPHandler等,
# 格式就是:"%(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')
一、最最簡單的使用方法:
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
# 我由於要寫檔案就使用了FileHandler。 # LOG_FILE是一個全域性變數,它就是一個檔名,如:'crawl.log' LOG_FILE ="/opt/xxx/log/debug.log" hdlr = logging.FileHandler(LOG_FILE) # 生成一個格式器,用於規範日誌的輸出格式。如果沒有這行程式碼,那麼預設的
上面程式碼中的使用方式,可以指定日誌的級別和格式,可用於區分開發環境和使用者環境中日誌的級別,減少不必要的空間浪費。三、日誌分割
當工程執行一段時間後,會發現日誌檔案越來越大,而且也不便於查詢某天的錯誤資訊。這就需要我們對日誌進行分割,分割形式有兩種: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等日誌檔案。