From bb11e79cb74d1695fcace4fcf5e60eb6f8c5e4ee Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Wed, 19 Sep 2012 15:33:36 -0700 Subject: [PATCH] Get the fallback working. --- cloudinit/{monkey_patch.py => patcher.py} | 54 ++++++++--------------- 1 file changed, 18 insertions(+), 36 deletions(-) rename cloudinit/{monkey_patch.py => patcher.py} (53%) diff --git a/cloudinit/monkey_patch.py b/cloudinit/patcher.py similarity index 53% rename from cloudinit/monkey_patch.py rename to cloudinit/patcher.py index 24b472ba..8921a79a 100644 --- a/cloudinit/monkey_patch.py +++ b/cloudinit/patcher.py @@ -18,57 +18,39 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +import imp import logging import sys +# Default fallback format FALL_FORMAT = 'FALLBACK: %(asctime)s - %(filename)s[%(levelname)s]: %(message)s' -Handler = logging.Handler -class QuietStreamHandler(Handler): +class QuietStreamHandler(logging.StreamHandler): def handleError(self, record): pass -class FallbackHandler(Handler): - def __init__(self, level=logging.NOTSET, fb_handler=None): - super(FallbackHandler, self).__init__(level) - if not fb_handler: - self.fallback_handler = QuietStreamHandler(sys.stderr) - else: - self.fallback_handler = fb_handler - self.fallback_handler.setFormatter(logging.Formatter(FALL_FORMAT)) - self.fallback_handler.setLevel(level) - - def flush(self): - super(FallbackHandler, self).flush() - self.fallback_handler.flush() - - def close(self): - super(FallbackHandler, self).close(self) - self.fallback_handler.close() - - def setLevel(self, level): - super(FallbackHandler, self).setLevel(self, level) - self.fallback_logger.setLevel(level) - - def handleError(self, record): - try: - self.fallback_logger.handle(record) - # Always ensure this one is flushed... - self.fallback_logger.flush() - except: - pass - - def _patch_logging(): - # Replace handler with one that will be more + # Replace 'handleError' with one that will be more # tolerant of errors in that it can avoid # re-notifying on exceptions and when errors # do occur, it can at least try to write to # sys.stderr using a fallback logger - logging.Handler = FallbackHandler + fallback_handler = QuietStreamHandler(sys.stderr) + fallback_handler.setFormatter(logging.Formatter(FALL_FORMAT)) + def handleError(self, record): + try: + fallback_handler.handle(record) + fallback_handler.flush() + except IOError: + pass + setattr(logging.Handler, 'handleError', handleError) def patch(): - _patch_logging() + imp.acquire_lock() + try: + _patch_logging() + finally: + imp.release_lock()