def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None):
BaseRotatingHandler.__init__(self, filename, 'a', encoding, delay)
self.when = when.upper()
self.backupCount = backupCount
self.utc = utc
self.atTime = atTime
# 日期设置,支持多种方式
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}(\.\w+)?$"
...
self.extMatch = re.compile(self.extMatch, re.ASCII)
self.interval = self.interval * interval # multiply by units requested
filename = self.baseFilename
if os.path.exists(filename):
t = os.stat(filename)[ST_MTIME] # 最后修正时间
else:
t = int(time.time())
self.rolloverAt = self.computeRollover(t) # 提早计算终止时间
def computeRollover(self, currentTime):
# 判别的办法还是很长很复杂的,先pass
def shouldRollover(self, record):
t = int(time.time())
if t >= self.rolloverAt: # 判别能否到期
return 1
return 0
def doRollover(self):
...
dfn = self.rotation_filename(self.baseFilename + "." +
time.strftime(self.suffix, timeTuple))
# 滚动日志文件
if os.path.exists(dfn):
os.remove(dfn)
self.rotate(self.baseFilename, dfn)
if self.backupCount > 0:
for s in self.getFilesToDelete():
os.remove(s)
...
# 计算下一个时间点
newRolloverAt = self.computeRollover(currentTime)
...
self.rolloverAt = newRolloverAt
日期滚动就是计算最后时间点,超过时间点则重重生成新的日志文件。
小结logging的处置逻辑大约是这样的:
创立Logger对象,提供API,用来接纳运用顺序日志
Logger对象包括多个Handler
每个Handler有一个Formatter对象
每条日志都会生成一个LogRecord对象
运用不同的Handler对象将LogRecored对象提交到不同的流
每个日志对象经过Formatter格式化输入
可以运用按日期/文件大小的方式停止日志文件的滚动记载
小技巧掩盖对象的 __reduce__ 办法,让对象支持 reduce 函数:
class RootLogger(Logger):
def __init__(self, level):
Logger.__init__(self, "root", level)
def __reduce__(self):
return getLogger, ()
线程锁的创立和释放:
_lock = threading.RLock()
def _acquireLock():
if _lock:
_lock.acquire()
def _releaseLock():
if _lock:
_lock.release()
线程锁的运用:
def addHandler(self, hdlr):
_acquireLock()
try:
self.handlers.append(hdlr)
finally:
_releaseLock()
def removeHandler(self, hdlr):
_acquireLock()
try:
self.handlers.remove(hdlr)
finally:
_releaseLock()
参考链接
Logging in Python https://realpython.com/python-logging/
日志操作手册 https://docs.python.org/zh-cn/3.8/howto/logging-cookbook.html#cookbook-rotator-namer
Python 的日志记载工具 https://docs.python.org/zh-cn/3.8/library/logging.html
【编辑引荐】
Excel用户的福音:不用写代码就能开发一个带界面的顺序
就凭这3点,可以完全了解Python的类办法与静态办法
学完编程基础语法之后应该做些什么
python深度学习:为什么要学习深度学习?
鸿蒙的JS开发部形式18:鸿蒙的文件上传到Python效劳器端
(责任编辑:admin)