Make beets loggers level thread local.

This updates the beets logger class. Tests are missing.
This commit is contained in:
Bruno Cauet 2015-03-25 11:19:54 +01:00
parent 127b92598c
commit dfa18b1119
2 changed files with 31 additions and 4 deletions

View file

@ -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

View file

@ -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")