summaryrefslogtreecommitdiff
path: root/cloudinit/patcher.py
diff options
context:
space:
mode:
authorVlastimil Holer <vlastimil.holer@gmail.com>2012-12-19 18:03:03 +0100
committerVlastimil Holer <vlastimil.holer@gmail.com>2012-12-19 18:03:03 +0100
commit8dd9678d97a822e477915c150d528096a83c9777 (patch)
treea9b5708edd9d448508abf00abdd9b7bdeba16541 /cloudinit/patcher.py
parenta9939fe768e04d52fe530c7467357d79b78a21f4 (diff)
parent3569e71a1579b97f4e33fb46ab3fcef08a4ddad4 (diff)
downloadvyos-cloud-init-8dd9678d97a822e477915c150d528096a83c9777.tar.gz
vyos-cloud-init-8dd9678d97a822e477915c150d528096a83c9777.zip
Merged trunk lp:cloud-init
Diffstat (limited to 'cloudinit/patcher.py')
-rw-r--r--cloudinit/patcher.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/cloudinit/patcher.py b/cloudinit/patcher.py
new file mode 100644
index 00000000..0f3c034e
--- /dev/null
+++ b/cloudinit/patcher.py
@@ -0,0 +1,58 @@
+# vi: ts=4 expandtab
+#
+# Copyright (C) 2012 Canonical Ltd.
+# Copyright (C) 2012 Yahoo! Inc.
+#
+# Author: Scott Moser <scott.moser@canonical.com>
+# Author: Joshua Harlow <harlowja@yahoo-inc.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 3, as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import imp
+import logging
+import sys
+
+# Default fallback format
+FALL_FORMAT = ('FALLBACK: %(asctime)s - %(filename)s[%(levelname)s]: ' +
+ '%(message)s')
+
+
+class QuietStreamHandler(logging.StreamHandler):
+ def handleError(self, record):
+ pass
+
+
+def _patch_logging():
+ # 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
+ fallback_handler = QuietStreamHandler(sys.stderr)
+ fallback_handler.setFormatter(logging.Formatter(FALL_FORMAT))
+
+ def handleError(self, record): # pylint: disable=W0613
+ try:
+ fallback_handler.handle(record)
+ fallback_handler.flush()
+ except IOError:
+ pass
+ setattr(logging.Handler, 'handleError', handleError)
+
+
+def patch():
+ imp.acquire_lock()
+ try:
+ _patch_logging()
+ finally:
+ imp.release_lock()