python中有專門的log模塊來寫日志,如下所示:
def initlog():
import logging
logger = logging.getLogger() # 生成一個日志對象
logfile = 'test.log' # logfile是一個全局變量,它就是一個文件名,如:'crawl.log'
hdlr = logging.FileHandler('sendlog.txt') # 生成一個Handler。logging支持許多Handler,象FileHandler, SocketHandler, SMTPHandler等,我由於要寫文件就使用了FileHandler。
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') # 格式器,用於規范日志的輸出格式。如果沒有這行代碼,那么缺省的格式就是:"%(message)s"。也就是寫日志時,信息是什么日志中就是什么,沒有 日期,沒有信息級別等信息。logging支持許多種替換值,詳細請看Formatter的文檔說明。這里有三項:時間,信息級別,日志信息
hdlr.setFormatter(formatter) # 將格式器設置到處理器上
logger.addHandler(hdlr) # 將處理器加到日志對象上
logger.setLevel(logging.NOTSET)
return logger
# 設置日志信息輸出的級別。logging提供多種級別的日志信息,如:NOTSET,
# DEBUG, INFO, WARNING, ERROR, CRITICAL等。每個級別都對應一個數值。
# 如果不執行此句,缺省為30(WARNING)。可以執行:logging.getLevelName
# (logger.getEffectiveLevel())來查看缺省的日志級別。日志對象對於不同
# 的級別信息提供不同的函數進行輸出,如:info(), error(), debug()等。當
# 寫入日志時,小於指定級別的信息將被忽略。因此為了輸出想要的日志級別一定
# 要設置好此參數。這里我設為NOTSET(值為0),也就是想輸出所有信息
程序中調用:
logging=initlog()
logging.info("2011-08-08")
那么日志中會打出:
2011-08-19 00:02:57,073 INFO 2011-08-08
2011-08-19 00:02:57,073 INFO 2011-08-08
這樣使用后其他都正常,但是有一點很奇怪,每次日志都會打兩遍,但我程序中明明只調用了一次,后來經過查找可能是原因是為在程序中addHandler后沒有移除這個句柄,所以可以修改上述log程序:
def initlog():
import logging
logger = logging.getLogger()
hdlr=logging.basicConfig(filename='test.log',level=logging.NOTSET,format='%(asctime)s %(levelname)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
return logger
即在basicConfig中設置日志的格式以及級別,經嘗試后,日志果然只發一遍了。
