python多进程下实现日志记录按时间分割
python多进程下实现日志记录按时间分割,供大家参考,具体内容如下
原理:自定义日志handler继承TimedRotatingFileHandler,并重写computeRollover与doRollover函数。其中重写computeRollover是为了能按整分钟/小时/天来分割日志,如按天分割,2018-04-1000:00:00~2018-04-1100:00:00,是一个半闭半开区间,且不是原意的:从日志创建时间或当前时间开始,到明天的这个时候。
代码如下:
#!/usr/bin/envpython
#encoding:utf-8
"""自定义日志处理类"""
importos
importtime
fromlogging.handlersimportTimedRotatingFileHandler
classMyLoggingHandler(TimedRotatingFileHandler):
def__init__(self,filename,when='h',interval=1,backupCount=0,encoding=None,delay=False,utc=False,atTime=None):
TimedRotatingFileHandler.__init__(self,filename,when=when,interval=interval,backupCount=backupCount,encoding=encoding,delay=delay,utc=utc,atTime=atTime)
defcomputeRollover(self,currentTime):
#将时间取整
t_str=time.strftime(self.suffix,time.localtime(currentTime))
t=time.mktime(time.strptime(t_str,self.suffix))
returnTimedRotatingFileHandler.computeRollover(self,t)
defdoRollover(self):
"""
doarollover;inthiscase,adate/timestampisappendedtothefilename
whentherolloverhappens.However,youwantthefiletobenamedforthe
startoftheinterval,notthecurrenttime.Ifthereisabackupcount,
thenwehavetogetalistofmatchingfilenames,sortthemandremove
theonewiththeoldestsuffix.
"""
ifself.stream:
self.stream.close()
self.stream=None
#getthetimethatthissequencestartedatandmakeitaTimeTuple
currentTime=int(time.time())
dstNow=time.localtime(currentTime)[-1]
t=self.rolloverAt-self.interval
ifself.utc:
timeTuple=time.gmtime(t)
else:
timeTuple=time.localtime(t)
dstThen=timeTuple[-1]
ifdstNow!=dstThen:
ifdstNow:
addend=3600
else:
addend=-3600
timeTuple=time.localtime(t+addend)
dfn=self.rotation_filename(self.baseFilename+"."+
time.strftime(self.suffix,timeTuple))
#修改内容--开始
#在多进程下,若发现dfn已经存在,则表示已经有其他进程将日志文件按时间切割了,只需重新打开新的日志文件,写入当前日志;
#若dfn不存在,则将当前日志文件重命名,并打开新的日志文件
ifnotos.path.exists(dfn):
try:
self.rotate(self.baseFilename,dfn)
exceptFileNotFoundError:
#这里会出异常:未找到日志文件,原因是其他进程对该日志文件重命名了,忽略即可,当前日志不会丢失
pass
#修改内容--结束
#原内容如下:
"""
ifos.path.exists(dfn):
os.remove(dfn)
self.rotate(self.baseFilename,dfn)
"""
ifself.backupCount>0:
forsinself.getFilesToDelete():
os.remove(s)
ifnotself.delay:
self.stream=self._open()
newRolloverAt=self.computeRollover(currentTime)
whilenewRolloverAt<=currentTime:
newRolloverAt=newRolloverAt+self.interval
#IfDSTchangesandmidnightorweeklyrollover,adjustforthis.
if(self.when=='MIDNIGHT'orself.when.startswith('W'))andnotself.utc:
dstAtRollover=time.localtime(newRolloverAt)[-1]
ifdstNow!=dstAtRollover:
ifnotdstNow:#DSTkicksinbeforenextrollover,soweneedtodeductanhour
addend=-3600
else:#DSTbowsoutbeforenextrollover,soweneedtoaddanhour
addend=3600
newRolloverAt+=addend
self.rolloverAt=newRolloverAt
说明
第一次修改,如有不妥之处,还请指出,不胜感激。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。