Source code for morpho.utilities.morphologging

'''
Morpho logging utilities
Authors: J. Johnston, M. Guigue
Date: 02/22/18
'''

from __future__ import absolute_import

import sys
try:
    reload  # Python 2.7
except NameError:
    try:
        from importlib import reload  # Python 3.4+
    except ImportError:
        from imp import reload  # Python 3.0 - 3.3
    reload(sys)
# sys.setdefaultencoding("utf-8")

import logging
import colorlog


[docs]def getLogger(name, stderr_lb=logging.ERROR, level=logging.DEBUG, propagate=False): """Return a logger object with the given settings that prints messages greater than or equal to a given level to stderr instead of stdout name: Name of the logger. Loggers are conceptually arranged in a namespace hierarchy using periods as separators. For example, a logger named morpho is the parent of a logger named morpho.plot, and by default the child logger will display messages with the same settings as the parent stderr_lb: Messages with level equal to or greaterthan stderr_lb will be printed to stderr instead of stdout level: Initial level for the logger propagate: Whether messages to this logger should be passed to the handlers of its ancestor""" logger = logging.getLogger(name) logger.setLevel(level) logger.propagate = propagate class LessThanFilter(logging.Filter): """Filter to get messages less than a given level """ def __init__(self, exclusive_maximum, name=""): super(LessThanFilter, self).__init__(name) self.max_level = exclusive_maximum def filter(self, record): # non-zero return means we log this message return 1 if record.levelno < self.max_level else 0 base_format = '%(asctime)s{}[%(levelname)-8s] %(name)s(%(lineno)d) -> {}%(message)s' morpho_formatter = colorlog.ColoredFormatter( base_format.format('%(log_color)s', '%(purple)s'), datefmt='%Y-%m-%dT%H:%M:%SZ'[:-1], reset=True, ) logger.handlers = [] handler_stdout = logging.StreamHandler(sys.stdout) handler_stdout.setFormatter(morpho_formatter) handler_stdout.setLevel(logging.DEBUG) handler_stdout.addFilter(LessThanFilter(stderr_lb)) logger.addHandler(handler_stdout) handler_stderr = logging.StreamHandler(sys.stderr) handler_stderr.setFormatter(morpho_formatter) handler_stderr.setLevel(stderr_lb) logger.addHandler(handler_stderr) # Create morpho and pystan loggers # Will be reinstantiated after parsing command line args if __main__ is run return logger