TimeRotatingFileHandler 源码解析
def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False):
BaseRotatingHandler.__init__(self, filename, 'a', encoding, delay)
self.when = when.upper()
self.backupCount = backupCount
self.utc = utc
if self.when == 'S':
self.interval = 1 # one second
self.suffix = "%Y-%m-%d_%H-%M-%S"
self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}$"
elif self.when == 'M':
self.interval = 60 # one minute
self.suffix = "%Y-%m-%d_%H-%M"
self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}$"
elif self.when == 'H':
self.interval = 60 * 60 # one hour
self.suffix = "%Y-%m-%d_%H"
self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}$"
elif self.when == 'D' or self.when == 'MIDNIGHT':
self.interval = 60 * 60 * 24 # one day
self.suffix = "%Y-%m-%d"
self.extMatch = r"^\d{4}-\d{2}-\d{2}$"
elif self.when.startswith('W'):
self.interval = 60 * 60 * 24 * 7 # one week
if len(self.when) != 2:
raise ValueError("You must specify a day for weekly rollover from 0 to 6 (0 is Monday): %s" % self.when)
if self.when[1] < '0' or self.when[1] > '6':
raise ValueError("Invalid day specified for weekly rollover: %s" % self.when)
self.dayOfWeek = int(self.when[1])
self.suffix = "%Y-%m-%d"
self.extMatch = r"^\d{4}-\d{2}-\d{2}$"
else:
raise ValueError("Invalid rollover interval specified: %s" % self.when)
self.extMatch = re.compile(self.extMatch)
self.interval = self.interval * interval # multiply by units requested
if os.path.exists(filename):
t = os.stat(filename)[ST_MTIME]
else:
t = int(time.time())
self.rolloverAt = self.computeRollover(t)
TimedRotatingFileHandler 用法自行百度
“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight
self.suffix = "%Y-%m-%d"
self.extMatch = r"^\d{4}-\d{2}-\d{2}$"
······
······
self.extMatch = re.compile(self.extMatch)
认设置when类型后,suffix是固定的,匹配的正则也是源码里写好的,所以当修改suffix后,必须连带正则一并修改
stamp = "dailylog.log"
。。。。
.。。。。。
handler=logging.handlers.TimedRotatingFileHandler(filename=v,when='D', interval=1, backupCount=15) handler.suffix = "%Y-%m-%d.log" handler.extMatch = r"^\d{4}-\d{2}-\d{2}.log$"
源码
# coding=utf-8 import logging import time import os import logging.handlers import re def logger(): # def __init__(self): # pass log_fmt= "%(asctime)s --%(name)s [%(levelname)s]:\n%(message)s" c_fmt="%(asctime)s --%(name)s [%(levelname)s]:\n%(message)s" date_format = "%Y-%m-%d %H:%M:%S %a" #设置控制台输出level logging.basicConfig( level=logging.DEBUG, format=c_fmt, datefmt=date_format, ) list_level=["Error","Info","Warning","Debug"] stamp = "dailylog.log" logsdir=os.path.join(os.getcwd(),"logs") if os.path.exists(logsdir): for p in list_level: if os.path.exists(os.path.join(logsdir,p)): pass else: os.mkdir(os.path.join(logsdir,p)) else: os.mkdir(logsdir) list_level=["Error","Info","Warning","Debug"] for p in list_level: print(os.path.join(logsdir,p)) os.mkdir(os.path.join(logsdir,p)) f_dict={} for i in list_level: filename=os.path.join(logsdir,i,stamp) f_dict[i]=filename logger= logging.getLogger('SshTest.class') for k,v in f_dict.items(): handler=logging.handlers.TimedRotatingFileHandler(filename=v,when='D', interval=1, backupCount=4) handler.suffix = "%Y-%m-%d.log" handler.extMatch = r"^\d{4}-\d{2}-\d{2}.log$" handler.extMatch = re.compile(handler.extMatch) h_fmt=logging.Formatter(log_fmt) handler.setFormatter(h_fmt) if k==list_level[0]: handler.setLevel(logging.ERROR) elif k==list_level[1]: handler.setLevel(logging.INFO) elif k== list_level[2]: handler.setLevel(logging.WARNING) else : handler.setLevel(logging.DEBUG) logger.addHandler(handler) return logger if __name__ == "__main__": logger=logger() while True: time.sleep(0.01) logger.info("file test") logger.debug("bebug test") logger.error("error test") logger.warning("warning test")
https://blog.youkuaiyun.com/qgf1099062139/article/details/83619280