log: Use custom filter to implement verbosity levels

...instead of hooking handlers onto multiple loggers with disabled propagation
from those loggers to parent loggers, breaking alternative log methods, like
custom setups through the the logging/config_file config value.

Fixes #661
This commit is contained in:
Stein Magnus Jodal 2014-01-23 22:35:24 +01:00
parent bb66cd1065
commit 06640f1f0c
2 changed files with 27 additions and 33 deletions

View File

@ -70,8 +70,7 @@ def main():
if args.verbosity_level:
verbosity_level += args.verbosity_level
log.setup_logging(
config, installed_extensions, verbosity_level, args.save_debug_log)
log.setup_logging(config, verbosity_level, args.save_debug_log)
enabled_extensions = []
for extension in installed_extensions:

View File

@ -31,16 +31,14 @@ def bootstrap_delayed_logging():
root.addHandler(_delayed_handler)
def setup_logging(config, extensions, verbosity_level, save_debug_log):
setup_log_levels(config)
setup_console_logging(config, extensions, verbosity_level)
if save_debug_log:
setup_debug_logging_to_file(config, extensions)
def setup_logging(config, verbosity_level, save_debug_log):
logging.captureWarnings(True)
setup_log_levels(config)
setup_console_logging(config, verbosity_level)
if save_debug_log:
setup_debug_logging_to_file(config)
if config['logging']['config_file']:
logging.config.fileConfig(config['logging']['config_file'])
@ -61,46 +59,43 @@ LOG_LEVELS = {
}
def setup_console_logging(config, extensions, verbosity_level):
class VerbosityFilter(logging.Filter):
def __init__(self, verbosity_level):
self.verbosity_level = verbosity_level
def filter(self, record):
if record.name.startswith('mopidy'):
required_log_level = LOG_LEVELS[self.verbosity_level]['mopidy']
else:
required_log_level = LOG_LEVELS[self.verbosity_level]['root']
return record.levelno >= required_log_level
def setup_console_logging(config, verbosity_level):
if verbosity_level < min(LOG_LEVELS.keys()):
verbosity_level = min(LOG_LEVELS.keys())
if verbosity_level > max(LOG_LEVELS.keys()):
verbosity_level = max(LOG_LEVELS.keys())
verbosity_filter = VerbosityFilter(verbosity_level)
if verbosity_level < 1:
log_format = config['logging']['console_format']
else:
log_format = config['logging']['debug_format']
formatter = logging.Formatter(log_format)
root_handler = logging.StreamHandler()
root_handler.setFormatter(formatter)
root_handler.setLevel(LOG_LEVELS[verbosity_level]['root'])
logging.getLogger('').addHandler(root_handler)
handler = logging.StreamHandler()
handler.addFilter(verbosity_filter)
handler.setFormatter(formatter)
mopidy_handler = logging.StreamHandler()
mopidy_handler.setFormatter(formatter)
mopidy_handler.setLevel(LOG_LEVELS[verbosity_level]['mopidy'])
add_mopidy_handler(extensions, mopidy_handler)
logging.getLogger('').addHandler(handler)
def setup_debug_logging_to_file(config, extensions):
def setup_debug_logging_to_file(config):
formatter = logging.Formatter(config['logging']['debug_format'])
handler = logging.handlers.RotatingFileHandler(
config['logging']['debug_file'], maxBytes=10485760, backupCount=3)
handler.setFormatter(formatter)
logging.getLogger('').addHandler(handler)
# We must add our handler explicitly, since the mopidy* handlers don't
# propagate to the root handler.
add_mopidy_handler(extensions, handler)
def add_mopidy_handler(extensions, handler):
names = ['mopidy_%s' % ext.ext_name for ext in extensions]
names.append('mopidy')
for name in names:
logger = logging.getLogger(name)
logger.propagate = False
logger.addHandler(handler)