1. 程式人生 > >Python中的日誌處理

Python中的日誌處理

分割 ret 其中 文件名 debug effective 處理器 日誌級別 backup

在日常項目中,總是需要記錄下一些細小信息或者錯誤碼、錯誤信息的,這個時候就需要進行日誌的操作。
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指定每個日誌文件的大小,如果文件超過1024比特就分割該日誌文件,最大的備份文件個數是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等日誌文件。

Python中的日誌處理