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
说明
第一次修改,如有不妥之处,还请指出,不胜感激。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。