From 8fccef98c714d3eb2ba43a394025cdef96ef70f3 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 11 Mar 2009 17:00:28 +0000 Subject: [PATCH] add missing file. Fixes #4898, #4874 --- src/common/logging_helpers.py | 184 ++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 src/common/logging_helpers.py diff --git a/src/common/logging_helpers.py b/src/common/logging_helpers.py new file mode 100644 index 000000000..ae5d1da3e --- /dev/null +++ b/src/common/logging_helpers.py @@ -0,0 +1,184 @@ +# -*- coding:utf-8 -*- +## src/common/logging_helpers.py +## +## Copyright (C) 2009 Bruno Tarquini +## +## This file is part of Gajim. +## +## Gajim is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published +## by the Free Software Foundation; version 3 only. +## +## Gajim 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 Gajim. If not, see . +## + +import logging +import i18n + +def parseLogLevel(arg): + """ + eiter numeric value or level name from logging module + """ + if arg.isdigit(): + return int(arg) + elif arg.isupper(): + return getattr(logging, arg) + else: + raise ValueError(_('%s is not a valid loglevel'), repr(arg)) + +def parseLogTarget(arg): + """ + [gajim.]c.x.y -> gajim.c.x.y + .other_logger -> other_logger + -> gajim + """ + arg = arg.lower() + if not arg: + return 'gajim' + elif arg.startswith('.'): + return arg[1:] + elif arg.startswith('gajim'): + return arg + else: + return 'gajim.' + arg + +def parseAndSetLogLevels(arg): + """ + [=]LOGLEVEL -> gajim=LOGLEVEL + gajim=LOGLEVEL -> gajim=LOGLEVEL + .other=10 -> other=10 + .=10 -> + c.x.y=c.z=20 -> gajim.c.x.y=20 + gajim.c.z=20 + gajim=10,c.x=20 -> gajim=10 + gajim.c.x=20 + """ + for directive in arg.split(','): + directive = directive.strip() + if not directive: + continue + if '=' not in directive: + directive = '=' + directive + targets, level = directive.rsplit('=', 1) + level = parseLogLevel(level.strip()) + for target in targets.split('='): + target = parseLogTarget(target.strip()) + if target: + logging.getLogger(target).setLevel(level) + print "Logger %s level set to %d" % (target, level) + + +class colors: + NONE = chr(27) + "[0m" + BLACk = chr(27) + "[30m" + RED = chr(27) + "[31m" + GREEN = chr(27) + "[32m" + BROWN = chr(27) + "[33m" + BLUE = chr(27) + "[34m" + MAGENTA = chr(27) + "[35m" + CYAN = chr(27) + "[36m" + LIGHT_GRAY = chr(27) + "[37m" + DARK_GRAY = chr(27) + "[30;1m" + BRIGHT_RED = chr(27) + "[31;1m" + BRIGHT_GREEN = chr(27) + "[32;1m" + YELLOW = chr(27) + "[33;1m" + BRIGHT_BLUE = chr(27) + "[34;1m" + PURPLE = chr(27) + "[35;1m" + BRIGHT_CYAN = chr(27) + "[36;1m" + WHITE = chr(27) + "[37;1m" + +def colorize(text, color): + return color + text + colors.NONE + +class FancyFormatter(logging.Formatter): + """ + A Eye-candy formatter with colors + """ + colors_mapping = { + 'DEBUG': colors.BLUE, + 'INFO' : colors.GREEN, + 'WARNING': colors.BROWN, + 'ERROR': colors.RED, + 'CRITICAL': colors.BRIGHT_RED, + } + + def __init__(self, fmt, datefmt=None, use_color=False): + logging.Formatter.__init__(self, fmt, datefmt) + self.use_color = use_color + + def formatTime(self, record, datefmt=None): + f = logging.Formatter.formatTime(self, record, datefmt) + if self.use_color: + f = colorize(f, colors.DARK_GRAY) + return f + + def format(self, record): + level = record.levelname + record.levelname = '(%s)' % level[0] + + if self.use_color: + c = FancyFormatter.colors_mapping.get(level, '') + record.levelname = colorize(record.levelname, c) + record.name = colorize(record.name, colors.CYAN) + else: + record.name += ':' + + return logging.Formatter.format(self, record) + + +def init(use_color=False): + """ + initialize the logging system + """ + consoleloghandler = logging.StreamHandler() + consoleloghandler.setFormatter( + FancyFormatter( + '%(asctime)s %(levelname)s %(name)s %(message)s', + '%H:%M:%S', + use_color + ) + ) + + # fake the root logger so we have 'gajim' root name instead of 'root' + root_log = logging.getLogger('gajim') + root_log.setLevel(logging.WARNING) + root_log.addHandler(consoleloghandler) + root_log.propagate = False + +def set_loglevels(loglevels_string): + parseAndSetLogLevels(loglevels_string) + +def set_verbose(): + parseAndSetLogLevels('gajim=1') + +def set_quiet(): + parseAndSetLogLevels('gajim=CRITICAL') + + +# tests +if __name__ == '__main__': + init(use_color=True) + + set_loglevels('gajim.c=DEBUG,INFO') + + log = logging.getLogger('gajim') + log.debug('debug') + log.info('info') + log.warn('warn') + log.error('error') + log.critical('critical') + + log = logging.getLogger('gajim.c.x.dispatcher') + log.debug('debug') + log.info('info') + log.warn('warn') + log.error('error') + log.critical('critical') + +# vim: se ts=3: