在平常項目中,老是須要記錄下一些細小信息或者錯誤碼、錯誤信息的,這個時候就須要進行日誌的操做。
python中用於日誌建立、設置和記錄等功能的模塊,就是logging了,下面是對其基本使用方法的介紹:
1、最最簡單的使用方法:python
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中了。
2、再來比較正規的使用方式:app
#!/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')
上面代碼中的使用方式,能夠指定日誌的級別和格式,可用於區分開發環境和用戶環境中日誌的級別,減小沒必要要的空間浪費。
3、日誌分割ide
當工程運行一段時間後,會發現日誌文件愈來愈大,並且也不便於查找某天的錯誤信息。這就須要咱們對日誌進行分割,分割形式有兩種: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等日誌文件。
View Code1 #! /usr/bin/env python 2 #-*- coding:utf8 -*- 3 #Author:zhangning 4 import logging 5 def logg_formart(): 6 logger = logging.getLogger() 7 # 建立一個handler,用於寫入日誌文件 8 fh = logging.FileHandler('test.log') 9 # fh.setLevel(logging.INFO) 10 11 # 再建立一個handler,用於輸出到控制檯 12 ch = logging.StreamHandler() 13 # ch.setLevel(logging.DEBUG) 14 15 formatter = logging.Formatter('%(asctime)s , %(levelname)s , [line:%(lineno)d] , %(message)s') 16 17 fh.setFormatter(formatter) 18 ch.setFormatter(formatter) 19 logger.setLevel(logging.DEBUG) 20 logger.addHandler(fh) #logger對象能夠添加多個fh和ch對象 21 logger.addHandler(ch) 22 return logger 23 24 logger =logg_formart() 25 for i in range(10): 26 logger.debug(i)true函數
View Code1 #!/usr/bin/env python 2 #-*- coding:utf8 -*- 3 import time 4 import logging 5 import logging.handlers 6 7 # # logging初始化工做 8 # logging.basicConfig() 9 # 10 # # myapp的初始化工做 11 # logger = logging.getLogger() 12 # logger.setLevel(logging.INFO) 13 # 14 # # 添加TimedRotatingFileHandler 15 # # 定義一個1秒換一次log文件的handler 16 # # 保留3箇舊log文件 17 # formatter = logging.Formatter('%(asctime)s , %(levelname)s , [line:%(lineno)d] , %(message)s') 18 # filehandler = logging.handlers.TimedRotatingFileHandler("myapp.log", when='S', interval=1, backupCount=3) 19 # # 設置後綴名稱,跟strftime的格式同樣 20 # #果設定是天,就必須寫成「%Y-%m-%d.log」,寫成其餘格式會致使刪除舊文件不生效 21 # filehandler.suffix = "%Y-%m-%d_%H-%M.log" 22 # filehandler.setFormatter(formatter) 23 # logger.addHandler(filehandler) 24 # 25 # while True: 26 # logger.info("test") 27 28 def log_formart(): 29 logging.basicConfig() 30 logger = logging.getLogger() 31 logger.setLevel(logging.INFO) 32 formatter = logging.Formatter('%(asctime)s , %(levelname)s , [line:%(lineno)d] , %(message)s') 33 filehandler = logging.handlers.TimedRotatingFileHandler("myapp.log", when='M', interval=1, backupCount=3) 34 filehandler.suffix = "%Y-%m-%d_%H-%M.log" 35 filehandler.setFormatter(formatter) 36 logger.addHandler(filehandler) 37 return logger 38 logging =log_formart() 39 while True: 40 time.sleep(5) 41 logging.info('test1')