import os
import sys
import logging
-from logging import (DEBUG, INFO, WARNING, ERROR, CRITICAL, getLogger)
+from logging import DEBUG, INFO, WARNING, ERROR, CRITICAL
import gbp.tristate
+# Initialize default logger
+LOGGER = logging.getLogger(__name__)
COLORS = dict([('none', 0)] + list(zip(['black', 'red', 'green', 'yellow', 'blue',
'magenta', 'cyan', 'white'], range(30, 38))))
def __init__(self, name, color='auto', *args, **kwargs):
super(GbpLogger, self).__init__(name, *args, **kwargs)
- self._default_handlers = [GbpStreamHandler(sys.stdout, color),
- GbpStreamHandler(sys.stderr, color)]
- self._default_handlers[0].addFilter(GbpFilter([DEBUG, INFO]))
- self._default_handlers[1].addFilter(GbpFilter([WARNING, ERROR,
- CRITICAL]))
- for hdlr in self._default_handlers:
+ self.default_handlers = []
+
+ def init_default_handlers(self, color='auto'):
+ """Initialize and set default handlers to logger"""
+ self.default_handlers = [GbpStreamHandler(sys.stdout, color),
+ GbpStreamHandler(sys.stderr, color)]
+ self.default_handlers[0].addFilter(GbpFilter([DEBUG, INFO]))
+ self.default_handlers[1].addFilter(GbpFilter([WARNING, ERROR,
+ CRITICAL]))
+ for hdlr in self.default_handlers:
self.addHandler(hdlr)
+ # We don't want to propagate as we add our own handlers
+ self.propagate = False
def set_color(self, color):
"""Set/unset colorized output of the default handlers"""
- for hdlr in self._default_handlers:
+ for hdlr in self.default_handlers:
hdlr.set_color(color)
def set_color_scheme(self, color_scheme={}):
"""Set the color scheme of the default handlers"""
- for hdlr in self._default_handlers:
+ for hdlr in self.default_handlers:
hdlr.set_color_scheme(color_scheme)
def set_format(self, fmt):
"""Set the format of the default handlers"""
- for hdlr in self._default_handlers:
+ for hdlr in self.default_handlers:
hdlr.set_format(fmt)
LOGGER.error(msg)
+def error(msg):
+ err(msg)
+
+
def warn(msg):
"""Logs a message with level WARNING on the GBP logger"""
LOGGER.warning(msg)
+def warning(msg):
+ warn(msg)
+
+
def info(msg):
"""Logs a message with level INFO on the GBP logger"""
LOGGER.info(msg)
return scheme
+def getLogger(*args, **kwargs):
+ """Gbp-specific function"""
+ if not issubclass(logging.getLoggerClass(), GbpLogger):
+ logging.setLoggerClass(GbpLogger)
+ color = kwargs.pop('color') if 'color' in kwargs else 'auto'
+ logger = logging.getLogger(*args, **kwargs)
+ if hasattr(logger, 'default_handlers') and not logger.default_handlers:
+ logger.init_default_handlers(color)
+ return logger
+
+
def setup(color, verbose, color_scheme=""):
"""Basic logger setup"""
+ # Initialize, if not done yet
+ if not isinstance(LOGGER, GbpLogger):
+ initialize()
+
LOGGER.set_color(color)
LOGGER.set_color_scheme(_parse_color_scheme(color_scheme))
if verbose:
LOGGER.setLevel(INFO)
-# Initialize the module
-logging.setLoggerClass(GbpLogger)
-
-LOGGER = getLogger("gbp")
+def initialize():
+ """Initialize the logger module"""
+ global LOGGER
+ LOGGER = getLogger("gbp")