Python中的日誌處理

在平常項目中,老是須要記錄下一些細小信息或者錯誤碼、錯誤信息的,這個時候就須要進行日誌的操做。
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等日誌文件。
 1 #! /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)
View Code

 true函數

 1 #!/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')
View Code
相關文章
相關標籤/搜索