Last active
May 30, 2018 10:12
-
-
Save Ethan-Zhang/7614592 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
# | |
# Copyright 2012 Ethan Zhang<http://github.com/Ethan-Zhang> | |
# | |
# Licensed under the Apache License, Version 2.0 (the "License"); you may | |
# not use this file except in compliance with the License. You may obtain | |
# a copy of the License at | |
# | |
# http://www.apache.org/licenses/LICENSE-2.0 | |
# | |
# Unless required by applicable law or agreed to in writing, software | |
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | |
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | |
# License for the specific language governing permissions and limitations | |
# under the License. | |
import time | |
import os | |
from logging.handlers import TimedRotatingFileHandler | |
class MultiProcessTimedRotatingFileHandler(TimedRotatingFileHandler): | |
def doRollover(self): | |
""" | |
do a rollover; in this case, a date/time stamp is appended to the filename | |
when the rollover happens. However, you want the file to be named for the | |
start of the interval, not the current time. If there is a backup count, | |
then we have to get a list of matching filenames, sort them and remove | |
the one with the oldest suffix. | |
""" | |
if self.stream: | |
self.stream.close() | |
# get the time that this sequence started at and make it a TimeTuple | |
t = self.rolloverAt - self.interval | |
if self.utc: | |
timeTuple = time.gmtime(t) | |
else: | |
timeTuple = time.localtime(t) | |
dfn = self.baseFilename + "." + time.strftime(self.suffix, timeTuple) | |
#if os.path.exists(dfn): | |
# os.remove(dfn) | |
if not os.path.exists(dfn): | |
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) | |
#print "%s -> %s" % (self.baseFilename, dfn) | |
self.mode = 'a' | |
self.stream = self._open() | |
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
lz,我想,会不会有多个进程有可能同时进入到
os.rename
这一步,然后进行操作呢?