# Commits

committed 140182a

Issue #5262: Fixed bug in next roll over time computation in TimedRotatingFileHandler.

• Participants
• Parent commits 3244fc4

# File Lib/logging/handlers.py

`         #`
`         # Case of the 'when' specifier is not important; lower or upper case`
`         # will work.`
`-        currentTime = int(time.time())`
`         if self.when == 'S':`
`             self.interval = 1 # one second`
`             self.suffix = "%Y-%m-%d_%H-%M-%S"`
` `
`         self.extMatch = re.compile(self.extMatch, re.ASCII)`
`         self.interval = self.interval * interval # multiply by units requested`
`-        self.rolloverAt = currentTime + self.interval`
`+        self.rolloverAt = self.computeRollover(int(time.time()))`
` `
`+    def computeRollover(self, currentTime):`
`+        """`
`+        Work out the rollover time based on the specified time.`
`+        """`
`+        result = currentTime + self.interval`
`         # If we are rolling over at midnight or weekly, then the interval is already known.`
`         # What we need to figure out is WHEN the next interval is.  In other words,`
`         # if you are rolling over at midnight, then your base interval is 1 day,`
`         # the rest.  Note that this code doesn't care about leap seconds. :)`
`         if self.when == 'MIDNIGHT' or self.when.startswith('W'):`
`             # This could be done with less code, but I wanted it to be clear`
`-            if utc:`
`+            if self.utc:`
`                 t = time.gmtime(currentTime)`
`             else:`
`                 t = time.localtime(currentTime)`
`             # r is the number of seconds left between now and midnight`
`             r = _MIDNIGHT - ((currentHour * 60 + currentMinute) * 60 +`
`                     currentSecond)`
`-            self.rolloverAt = currentTime + r`
`+            result = currentTime + r`
`             # If we are rolling over on a certain day, add in the number of days until`
`             # the next rollover, but offset by 1 since we just calculated the time`
`             # until the next day starts.  There are three cases:`
`             # The calculations described in 2) and 3) above need to have a day added.`
`             # This is because the above time calculation takes us to midnight on this`
`             # day, i.e. the start of the next day.`
`-            if when.startswith('W'):`
`+            if self.when.startswith('W'):`
`                 day = t[6] # 0 is Monday`
`                 if day != self.dayOfWeek:`
`                     if day < self.dayOfWeek:`
`                         daysToWait = self.dayOfWeek - day`
`                     else:`
`                         daysToWait = 6 - day + self.dayOfWeek + 1`
`-                    newRolloverAt = self.rolloverAt + (daysToWait * (60 * 60 * 24))`
`-                    if not utc:`
`+                    newRolloverAt = result + (daysToWait * (60 * 60 * 24))`
`+                    if not self.utc:`
`                         dstNow = t[-1]`
`                         dstAtRollover = time.localtime(newRolloverAt)[-1]`
`                         if dstNow != dstAtRollover:`
`                                 newRolloverAt = newRolloverAt - 3600`
`                             else:           # DST bows out before next rollover, so we need to add an hour`
`                                 newRolloverAt = newRolloverAt + 3600`
`-                    self.rolloverAt = newRolloverAt`
`-`
`-        #print "Will rollover at %d, %d seconds from now" % (self.rolloverAt, self.rolloverAt - currentTime)`
`+                    result = newRolloverAt`
`+        return result`
` `
`     def shouldRollover(self, record):`
`         """`
`         #print "%s -> %s" % (self.baseFilename, dfn)`
`         self.mode = 'w'`
`         self.stream = self._open()`
`-        newRolloverAt = self.rolloverAt + self.interval`
`         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.`

# File Misc/NEWS

` Library`
` -------`
` `
`+- Issue #5262: Fixed bug in next rollover time computation in`
`+  TimedRotatingFileHandler.`
`+`
` - Issue #6217: The C implementation of io.TextIOWrapper didn't include the`
`   errors property.  Additionally, the errors and encoding properties of StringIO`
`   are always None now.`
` - Issue #5150: IDLE's format menu now has an option to strip trailing`
`   whitespace.`
` `
`-- Issue #5940: distutils.command.build_clib.check_library_list was not doing `
`+- Issue #5940: distutils.command.build_clib.check_library_list was not doing`
`   the right type checkings anymore.`
` `
` - Issue #4875: On win32, ctypes.util.find_library does no longer`
` `
` - Issue #6048: Now Distutils uses the tarfile module in archive_util.`
` `
`-- Issue #6062: In distutils, fixed the package option of build_ext. Feedback `
`+- Issue #6062: In distutils, fixed the package option of build_ext. Feedback`
`   and tests on pywin32 by Tim Golden.`
` `
` - Issue #6053: Fixed distutils tests on win32. patch by Hirokazu Yamamoto.`
` - Issue #6046: Fixed the library extension when distutils build_ext is used`
`   inplace. Initial patch by Roumen Petrov.`
` `
`-- Issue #6041: Now distutils `sdist` and `register` commands use `check` as a `
`+- Issue #6041: Now distutils `sdist` and `register` commands use `check` as a`
`   subcommand.`
` `
` - Issue #6022: a test file was created in the current working directory by`
` `
` - Issue #2245: aifc now skips chunk types it doesn't recognize, per spec.`
` `
`-- Issue #5874: distutils.tests.test_config_cmd is not locale-sensitive `
`+- Issue #5874: distutils.tests.test_config_cmd is not locale-sensitive`
`   anymore.`
` `
` - Issue #5810: Fixed Distutils test_build_scripts so it uses`
`   linker, rather than always exit successfully. Patch by Floris Bruynooghe.`
` `
` - Issue #4587: Add configure option --with-dbmliborder=db1:db2:... to specify`
`-  the order that backends for the dbm extension are checked. `
`+  the order that backends for the dbm extension are checked.`
` `
` - Link the shared python library with \$(MODLIBS).`
` `