| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #  | 
| ##@package  | 
| #  | 
| # @todo:   | 
| #  | 
| # @author: Alee  | 
| # @date 2018-7-18 ÉÏÎç11:40:53  | 
| # @version 1.0  | 
| #  | 
| # @note:   | 
| #  | 
| #---------------------------------------------------------------------  | 
|   | 
| #¸ù¾Ýʱ¼äÇл»Ä¿Â¼ºÍÎļþµÄÎļþ´¦ÀíÆ÷  | 
|   | 
| from logging.handlers import *  | 
|   | 
| class TimeRotatingPathFileHandler(TimedRotatingFileHandler):  | 
|     def __init__(self, root, filename, when = 'h', interval = 1, backupCount = 0, encoding = None, delay = False, utc = False):  | 
|         #´´½¨Êä³öĿ¼Êý  | 
|         t = int(time.time())  | 
|         if utc:  | 
|             timeTup = time.gmtime(t)  | 
|         else:  | 
|             timeTup = time.localtime(t)  | 
|         year = timeTup[0]  | 
|         month = timeTup[1]  | 
|         day = timeTup[2]  | 
|         self.root = root  | 
|         self.filename = filename  | 
|         self.baseFilename = self.getBaseFileName(self.root, year, month, day, self.filename)  | 
|           | 
|         #print 'baseFileName = %s'%self.baseFilename  | 
|         filepath = os.path.dirname(self.baseFilename)  | 
|         self.ensurePath(filepath)  | 
|         #¸Ä±äµ±Ç°¹¤×÷Ŀ¼  | 
|         #if not (os.getcwd() == filepath):  | 
|         #    os.chdir(filepath)  | 
|         TimedRotatingFileHandler.__init__(self, self.baseFilename, when, interval, backupCount, encoding, delay, utc)  | 
|         #self.suffix = ''#²»Ö¸¶¨ºó׺  | 
|           | 
|     def getBaseFileName(self, root, year, month, day, filename):  | 
|         filenameWithoutExt = filename.split('.')[0]  | 
|         return os.path.join(root, '%04d-%02d\\%s\\%02d\\%s'%(year, month, filenameWithoutExt, day, filename))  | 
|       | 
|     def ensurePath(self, filepath):  | 
|         if not os.path.exists(filepath):  | 
|             os.makedirs(filepath)  | 
|           | 
|     def doRollover(self):  | 
|         lastRolloverTime = self.rolloverAt  | 
|         #TimedRotatingFileHandler.doRollover(self)  | 
|         if self.stream:  | 
|             self.stream.close()  | 
|             self.stream = None  | 
|         #»ñÈ¡ÉÏÒ»´ÎÇл»µÄʱ¼ä  | 
|         t = self.rolloverAt - self.interval  | 
|         if self.utc:  | 
|             timeTuple = time.gmtime(t)  | 
|         else:  | 
|             timeTuple = time.localtime(t)  | 
|         filenameTuple = self.filename.split('.')  | 
|         filename = ''  | 
|         if len(filenameTuple) == 1:  | 
|             filename = '%s-%s'%(filenameTuple[0], time.strftime(self.suffix, timeTuple))  | 
|         else:  | 
|             filename = '%s-%s.%s'%(filenameTuple[0], time.strftime(self.suffix, timeTuple), filenameTuple[len(filenameTuple) - 1])  | 
|         dfn = os.path.join(self.root, '%04d-%02d\\%s\\%02d\\%s'%(timeTuple[0], timeTuple[1], filenameTuple[0], timeTuple[2], filename))  | 
|         #dfn = self.baseFilename + "." + time.strftime(self.suffix, timeTuple)  | 
|         if os.path.exists(dfn):  | 
|             os.remove(dfn)  | 
| #        print 'dfn = %s baseFilename = %s'%(dfn, self.baseFilename)  | 
|         #¿ÉÄÜÓÉÓÚ¸Äϵͳʱ¼ä»òÆäËûÈËΪÔÒòÔì³ÉÎļþÕÒ²»µ½  | 
|         if os.path.exists(self.baseFilename):  | 
|             os.rename(self.baseFilename, dfn)  | 
|         if self.backupCount > 0:  | 
|             # find the oldest log file and delete it  | 
|             #s = glob.glob(self.baseFilename + ".20*")  | 
|             #if len(s) > self.backupCount:  | 
|             #    s.sort()  | 
|             #    os.remove(s[0])  | 
|             for s in self.getFilesToDelete():  | 
|                 os.remove(s)  | 
|                   | 
|         currentTime = int(time.time())  | 
|         newRolloverAt = self.computeRollover(currentTime)  | 
|         while newRolloverAt <= currentTime:  | 
|             newRolloverAt = newRolloverAt + self.interval  | 
|         #If DST changes and midnight or weekly rollover, adjust for this.  | 
|         if (self.when == 'MIDNIGHT' or self.when.startswith('W')) and not self.utc:  | 
|             dstNow = time.localtime(currentTime)[-1]  | 
|             dstAtRollover = time.localtime(newRolloverAt)[-1]  | 
|             if dstNow != dstAtRollover:  | 
|                 if not dstNow:  # DST kicks in before next rollover, so we need to deduct an hour  | 
|                     newRolloverAt = newRolloverAt - 3600  | 
|                 else:           # DST bows out before next rollover, so we need to add an hour  | 
|                     newRolloverAt = newRolloverAt + 3600  | 
|         self.rolloverAt = newRolloverAt  | 
|                   | 
|         #ÅжÏÊÇ·ñÐèÒªÇл»Îļþ¼Ð  | 
|         nextRolloverTime = self.rolloverAt  | 
|         if self.utc:  | 
|             lastRolloverTimeTup = time.gmtime(lastRolloverTime)  | 
|             nextRolloverTimeTup = time.gmtime(nextRolloverTime)  | 
|         else:  | 
|             lastRolloverTimeTup = time.localtime(lastRolloverTime)  | 
|             nextRolloverTimeTup = time.localtime(nextRolloverTime)  | 
|         lastRolloverYear = lastRolloverTimeTup[0]  | 
|         lastRolloverMonth = lastRolloverTimeTup[1]  | 
|         lastRolloverDay = lastRolloverTimeTup[2]  | 
|         nextRolloverYear = nextRolloverTimeTup[0]  | 
|         nextRolloverMonth = nextRolloverTimeTup[1]  | 
|         nextRolloverDay = nextRolloverTimeTup[2]  | 
|         if lastRolloverYear != nextRolloverYear or lastRolloverMonth != nextRolloverMonth or lastRolloverDay != nextRolloverDay:  | 
|             #Äê»òÔ¸ı䣬¸ü»»Îļþ¼Ð  | 
|             self.baseFilename = self.getBaseFileName(self.root, nextRolloverYear, nextRolloverMonth, nextRolloverDay, self.filename)  | 
| #            print 'need to rollove path:%s-%s -> %s-%s'%(lastRolloverYear, lastRolloverMonth,  | 
| #                                                         nextRolloverYear, nextRolloverMonth)  | 
|             filepath = os.path.dirname(self.baseFilename)  | 
|             self.ensurePath(filepath)  | 
|         else:  | 
|             pass  | 
|           | 
|         self.mode = 'w'  | 
|         self.stream = self._open()  | 
|       | 
| def test():  | 
|     import logging  | 
|       | 
|     mylogger = logging.getLogger('test')  | 
|     mylogger.setLevel(logging.DEBUG)  | 
|     hdlr = TimeRotatingPathFileHandler('d:\\ServerLog\\', 'AD.txt')  | 
|     fs = '%(asctime)s\t%(levelname)-8s\t%(message)s'  | 
|     dfs = '%Y-%m-%dT%H:%M:%S'  | 
|     fmt = logging.Formatter(fs, dfs)  | 
|     hdlr.setLevel(logging.DEBUG)  | 
|     hdlr.setFormatter(fmt)  | 
|     mylogger.addHandler(hdlr)  | 
|       | 
| #    mylogger.info('test')  | 
| #    os.system('pause')  | 
|       | 
|     exit = False  | 
|     cnt = 0  | 
|     lastTime = time.time()  | 
|     while not exit:  | 
|         curTime = time.time()  | 
|         if curTime - lastTime >= 60:  | 
|             lastTime = curTime  | 
|             mylogger.info('test')  | 
|   | 
| if __name__ == "__main__":  | 
|     test()  |