mirror of
https://github.com/beetbox/beets.git
synced 2025-12-15 13:07:09 +01:00
Make beets loggers level thread local.
This updates the beets logger class. Tests are missing.
This commit is contained in:
parent
127b92598c
commit
dfa18b1119
2 changed files with 31 additions and 4 deletions
|
|
@ -27,6 +27,7 @@ from copy import copy
|
||||||
from logging import * # noqa
|
from logging import * # noqa
|
||||||
import sys
|
import sys
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import threading
|
||||||
|
|
||||||
|
|
||||||
# We need special hacks for Python 2.6 due to logging.Logger being an
|
# 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))
|
suffix = '.'.join((self.name, suffix))
|
||||||
return self.manager.getLogger(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 = copy(Logger.manager)
|
||||||
my_manager.loggerClass = StrFormatLogger
|
my_manager.loggerClass = BeetsLogger
|
||||||
|
|
||||||
|
|
||||||
def getLogger(name=None):
|
def getLogger(name=None):
|
||||||
|
|
@ -132,7 +157,7 @@ if PY26:
|
||||||
# it either does not exist or is a placeholder
|
# it either does not exist or is a placeholder
|
||||||
logger = old_getLogger(name)
|
logger = old_getLogger(name)
|
||||||
if change_its_type:
|
if change_its_type:
|
||||||
logger.__class__ = StrFormatLogger
|
logger.__class__ = BeetsLogger
|
||||||
return logger
|
return logger
|
||||||
|
|
||||||
my_manager.getLogger = new_getLogger
|
my_manager.getLogger = new_getLogger
|
||||||
|
|
|
||||||
|
|
@ -23,10 +23,12 @@ class LoggingTest(TestCase):
|
||||||
l3 = blog.getLogger("bar123")
|
l3 = blog.getLogger("bar123")
|
||||||
l4 = log.getLogger("bar123")
|
l4 = log.getLogger("bar123")
|
||||||
self.assertEqual(l3, l4)
|
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")
|
l5 = l3.getChild("shalala")
|
||||||
self.assertEqual(l5.__class__, blog.StrFormatLogger)
|
self.assertEqual(l5.__class__, blog.BeetsLogger)
|
||||||
|
|
||||||
def test_str_format_logging(self):
|
def test_str_format_logging(self):
|
||||||
l = blog.getLogger("baz123")
|
l = blog.getLogger("baz123")
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue