When there is a need, there is a solution.
As explained in the previous post "The TimedRotatingFileHandler of python logging system"
, the handler is not doing what I am thinking to do. So I made this new handler OnMarkRotatingFileHandler
to fulfill my need. For example, assuming the Interval setting is "Hour":
1, If the program starts at 8:20AM, the TimedRotatingFileHandler will restart a new log file at 9:20AM, but my OnMarkRotatingFileHandler will restart a new log file at 9:00AM.
2, If the previous log file was last modified at 8:58 AM, if you start the program with old handler after 9:58, it will rotate the log; if you start the program before 9:58, say 9:55 the program will just append the log entries into the existing log until 10:55, if your program runs for that long.
With my new handler, now at 9:00AM, when the program starts, the new handler will rotate the log file to generate new log file.
__author__ = 'ben'
def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False):
#super().__init__() # in Python 2 use super(D, self).__init__()
super(OnMarkRotatingFileHandler, self).__init__(filename, when, interval, backupCount, encoding, delay, utc)
def floor_to(self, num, scale):
return int(num/scale) * scale
def computeRollover(self, currentTime):
temp_result = super(OnMarkRotatingFileHandler, self).computeRollover(currentTime)
if not self.when.startswith('W'):
result = self.floor_to(temp_result, self.interval)
result = temp_result # need to find out the first date of time (is it 1970/1/1?), what weekday that is.
Most methods are inherited from the TimedRotatingFileHandler. The W0/W1.../W6 options are not implemented yet. But you get the ideal.
To use it, place the logHandler.py with your code, then you can either import it and load it as
h = logHandler.OnMarkRotatingFileHandler ("filename")
or you can use it in the logging.ini:
then load it in logging.config like every other handler does:
Have fun hacking!