標籤:
Python 標準日誌模組使用 Handler 控制日誌訊息寫到不同的目的地,如檔案、流、郵件、socket 等。除了StreamHandler、 FileHandler 和 NullHandler 定義在 logging 模組中,其他的 Handler 均定義在 logging.hangdlers 模組中。這些 Handler 是:WatchedFileHandler、RotatingFileHandler、TimedRotatingFileHandler、SocketHandler、DatagramHandler、SysLogHandler、NTEventLogHandler、SMTPHandler、MemoryHandler、HTTPHandler。
RotatingFileHandler 能夠管理記錄檔的大小,當記錄檔的大小達到閾值後,它會重新命名記錄檔,然後再建立一個新的同名記錄檔繼續輸出。
import loggingimport logging.handlershandler = logging.handlers.RotatingFileHandler( filename = ‘myapp.log‘, maxBytes = 200, backupCount = 5,)handler.setFormatter( logging.Formatter( fmt = ‘%(asctime)s [%(threadName)s] (%(filename)s:%(lineno)d) %(levelname)s - %(message)s‘, datefmt = ‘%Y-%m-%d %H:%M:%S‘ ))root = logging.getLogger()root.setLevel(logging.DEBUG)root.addHandler(handler)for i in range(20): root.debug(‘The Message(%d/20).‘ % (i + 1))
參數 maxBytes 設定了記錄檔大小的閾值,參數 backupCount 設定了備份檔案的個數。當記錄檔即 myapp.log 的大小達到閾值200位元組的時候,RotatingFileHandler 會將 myapp.log 重新命名為 myapp.log.1,然後再建立一個新的同名記錄檔 myapp.log。當 myapp.log 的大小又達到200位元組時,RotatingFileHandler 將會把 myapp.log.1 重新命名為 myapp.log.2,再把 myapp.log 重新命名為 myapp.log.1,然後再建立一個新的同名記錄檔 myapp.log。這樣反覆直到建立了5個備份檔案後,當 myapp.log 的大小再次達到200位元組時,RotatingFileHandler 不會將 myapp.log.5 重新命名為 myapp.log.6 而是將其刪除。
TimedRotatingFileHandler 和 RotatingFileHandler 類似,不過,TimedRotatingFileHandler 沒有通過判斷檔案大小來決定何時重新建立記錄檔,而是間隔一定時間就自動建立新的記錄檔。重新命名的過程中,備份記錄檔的尾碼不是數字,而是目前時間。
import loggingimport logging.handlersimport timehandler = logging.handlers.TimedRotatingFileHandler( filename = ‘myapp.log‘, when = ‘M‘, interval = 2, backupCount = 3,)handler.setFormatter( logging.Formatter( fmt = ‘%(asctime)s [%(threadName)s] (%(filename)s:%(lineno)d) %(levelname)s - %(message)s‘, datefmt = ‘%Y-%m-%d %H:%M:%S‘ ))root = logging.getLogger()root.setLevel(logging.DEBUG)root.addHandler(handler)for i in range(20): root.debug(‘The Message(%d/20).‘ % (i + 1)) time.sleep(30)
參數 interval 設定了時間間隔,參數 when 設定了間隔的單位。when 的取值可以是 ‘S‘(秒)、 ‘M‘(分)、 ‘H‘(小時)、 ‘D‘(天)、 ‘W0‘ - ‘W6‘(周一至周六)、 ‘midnight‘(淩晨),當 when 的取值是 ‘W0‘ - ‘W6‘ 或 ‘midnight‘ 時,參數 interval 的取值是被忽略的。
SMTPHandler 能夠通過 SMTP 將日誌訊息發送到郵件伺服器中。
import loggingimport logging.handlershandler = logging.handlers.SMTPHandler( mailhost = (‘smtp.163.com‘, 25), fromaddr = ‘[email protected]‘, toaddrs = ‘[email protected]‘, subject = ‘SMTPHandler Demo‘, credentials = (‘[email protected]‘, ‘123456‘))handler.setLevel(logging.CRITICAL)handler.setFormatter( logging.Formatter( fmt = ‘%(asctime)s [%(threadName)s] (%(filename)s:%(lineno)d) %(levelname)s - %(message)s‘, datefmt = ‘%Y-%m-%d %H:%M:%S‘ ))root = logging.getLogger()root.addHandler(handler)root.critical(‘This is a critical message‘);
其他 Handler 的用法樣本待補充。
Python(2.7.6) 標準日誌模組 - Logging Handler