#!/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()
|