diff --git a/beets/logging.py b/beets/logging.py index c03055856..d57975389 100644 --- a/beets/logging.py +++ b/beets/logging.py @@ -27,6 +27,7 @@ from copy import copy from logging import * # noqa import sys import subprocess +import threading # We need special hacks for Python 2.6 due to logging.Logger being an @@ -108,8 +109,32 @@ class StrFormatLogger(Logger): suffix = '.'.join((self.name, suffix)) return self.manager.getLogger(suffix) +class ThreadLocalLevelLogger(Logger): + """A version of `Logger` whose level is thread-local instead of shared. + """ + def __init__(self, name, level=NOTSET): + self._thread_level = threading.local() + super(ThreadLocalLevelLogger, self).__init__(name, level) + + @property + def level(self): + try: + return self._thread_level.level + except AttributeError: + self._thread_level.level = NOTSET + return self.level + + @level.setter + def level(self, value): + self._thread_level.level = value + + +class BeetsLogger(ThreadLocalLevelLogger, StrFormatLogger): + pass + + my_manager = copy(Logger.manager) -my_manager.loggerClass = StrFormatLogger +my_manager.loggerClass = BeetsLogger def getLogger(name=None): @@ -132,7 +157,7 @@ if PY26: # it either does not exist or is a placeholder logger = old_getLogger(name) if change_its_type: - logger.__class__ = StrFormatLogger + logger.__class__ = BeetsLogger return logger my_manager.getLogger = new_getLogger diff --git a/test/test_logging.py b/test/test_logging.py index 2f86e4ca9..ae22def46 100644 --- a/test/test_logging.py +++ b/test/test_logging.py @@ -23,10 +23,12 @@ class LoggingTest(TestCase): l3 = blog.getLogger("bar123") l4 = log.getLogger("bar123") self.assertEqual(l3, l4) - self.assertEqual(l3.__class__, blog.StrFormatLogger) + self.assertEqual(l3.__class__, blog.BeetsLogger) + self.assertIsInstance(l3, (blog.StrFormatLogger, + blog.ThreadLocalLevelLogger)) l5 = l3.getChild("shalala") - self.assertEqual(l5.__class__, blog.StrFormatLogger) + self.assertEqual(l5.__class__, blog.BeetsLogger) def test_str_format_logging(self): l = blog.getLogger("baz123")