Source code for jubakit.logger

# -*- coding: utf-8 -*-

from __future__ import absolute_import, division, print_function, unicode_literals

import sys
import os
import logging

# Import log levels.
from logging import DEBUG, INFO, WARNING, ERROR, CRITICAL

# Define the default logging format.
_DEFAULT_FORMAT = '[%(name)s] %(asctime)s: (%(levelname)s) %(message)s'

# jubakit root logger name.
_LOGGER_NAME = 'jubakit'

class _Logger(object):
  # Logger instance.
  logger = None

  # Define the defualt log handler which does nothing.
  class _NullHandler(logging.Handler):
    def emit(self, record):
      pass

  @classmethod
  def init(cls):
    cls.logger = logging.getLogger(_LOGGER_NAME)
    logger = cls.logger
    levelname = os.environ.get('JUBAKIT_LOG_LEVEL', None)
    if not levelname:
      # Surpress printing logs by default.
      logger.addHandler(cls._NullHandler())
      logger.setLevel(CRITICAL)
      return

    # Setup logger from environment variable.
    for lvl in (DEBUG, INFO, WARNING, ERROR, CRITICAL):
      if logging.getLevelName(lvl) == levelname:
        setup_logger(lvl)
        break
    else:
      setup_logger(INFO)
      logger.warning('invalid JUBAKIT_LOG_LEVEL (%s) specified; continue with INFO', levelname)

[docs]def setup_logger(level=WARNING, f=sys.stderr, log_format=_DEFAULT_FORMAT): """ Convenient method to setup the logger. """ handler = logging.StreamHandler(f) handler.setFormatter(logging.Formatter(log_format)) logger = _Logger.logger logger.propagate = False logger.addHandler(handler) logger.setLevel(level)
[docs]def get_logger(name=None): """ Returns the logger. If `name` is specified, child logger is returned. Otherwise the default jubakit logger is returned. This is mainly expected for internal uses but users can get logger to print their own logs. """ logger = _Logger.logger if name is None: return logger elif hasattr(logger, 'getChild'): # Python 2.7+ return logger.getChild(name) else: return logging.getLogger('{0}.{1}'.format(_LOGGER_NAME, name))