Python中的logging模塊:按時間滾動、按文件大小滾動、過期刪除

Python中自帶了logging庫,可以提供打印日誌、記錄日誌文件、根據時間日誌滾動、根據文件大小日誌滾動、過期文件刪除的功能。

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import logging.handlers #日誌滾動及刪除使用

#1.設置log日誌記錄格式及記錄級別
#level記錄級別包括DEBUG/INFO/WARNING/ERROR/CRITICAL,級別依次上升,log只會輸出保存設置的級別及以上的日誌。如果設置level=logging.DEBUG,則所有級別日誌都會輸出保存、如果level=logging.CRITICAL,則只輸出保存CRITICAL級別日誌
#format輸出格式levelname級別名、asctime 時間、filename所在文件名、message記錄內容
#datefmt 時間格式
#filename 要保存的文件名
#a寫入模式,a則每次啓動腳本時在原有文件中繼續添加;w則每次啓動腳本會重置文件然後記錄
logging.basicConfig(level=logging.INFO,
                format='%(levelname)s: %(asctime)s %(filename)s %(message)s',
                datefmt='%Y-%m-%d %A %H:%M:%S',
                filename='myapp.log',
                filemode='a')

#2.設置log日誌的標準輸出打印,如果不需要在終端輸出結果可忽略
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(levelname)s: %(asctime)s %(filename)s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)

#3.設置log日誌文件按時間拆分記錄,並保存幾個歷史文件,如果不需要拆分文件記錄可忽略
#class logging.handlers.WatchedFileHandler(filename, mode='a', encoding=None, delay=False)
#例:設置每天保存一個log文件,以日期爲後綴,保留7箇舊文件。
myapp = logging.getLogger()
myapp.setLevel(logging.INFO)
formatter = logging.Formatter('%(levelname)s: %(asctime)s %(filename)s %(message)s')
filehandler = logging.handlers.TimedRotatingFileHandler("myapp.log", when='d', interval=1, backupCount=7)#每 1(interval) 天(when) 重寫1個文件,保留7(backupCount) 箇舊文件;when還可以是Y/m/H/M/S
filehandler.suffix = "%Y-%m-%d_%H-%M-%S.log"#設置歷史文件 後綴
filehandler.setFormatter(formatter)
myapp.addHandler(filehandler)

#4.設置log日誌文件按文件大小拆分記錄,並保存幾個歷史文件,如果不需要拆分文件記錄可忽略
#class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)
myapp = logging.getLogger()
myapp.setLevel(logging.INFO)
formatter = logging.Formatter('%(levelname)s: %(asctime)s %(filename)s %(message)s')
filehandler = logging.handlers. RotatingFileHandler("myapp.log", mode='a', maxBytes=1024, backupCount=2)#每 1024Bytes重寫一個文件,保留2(backupCount) 箇舊文件
filehandler.setFormatter(formatter)
myapp.addHandler(filehandler)


#使用
logging.debug('debug message : %s , result: %s',info,result)  
logging.info('info message')  
logging.warning('warning message')  
logging.error('error message')  
logging.critical('critical message') 

輸出format參數中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 數字形式的日誌級別
%(levelname)s 文本形式的日誌級別
%(pathname)s 調用日誌輸出函數的模塊的完整路徑名,可能沒有
%(filename)s 調用日誌輸出函數的模塊的文件名
%(module)s 調用日誌輸出函數的模塊名
%(funcName)s 調用日誌輸出函數的函數名
%(lineno)d 調用日誌輸出函數的語句所在的代碼行
%(created)f 當前時間,用UNIX標準的表示時間的浮 點數表示
%(relativeCreated)d 輸出日誌信息時的,自Logger創建以 來的毫秒數
%(asctime)s 字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號後面的是毫秒
%(thread)d 線程ID。可能沒有
%(threadName)s 線程名。可能沒有
%(process)d 進程ID。可能沒有
%(message)s用戶輸出的消息

**注:1和3/4只設置一個就可以,如果同時設置了1和3,log日誌中會出現一條記錄存了兩遍的問題。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章