Source code for simple_loggers

#!/usr/bin/env python
# -*- coding=utf-8 -*-
"""
    A Simple Logger Package
"""
import os
import sys
import json
import logging

import coloredlogs

BASE_DIR = os.path.dirname(os.path.realpath(__file__))

version_info = json.load(open(os.path.join(BASE_DIR, 'version', 'version.json')))
__version__ = version_info['version']


NOT_WINDOWS = not sys.platform.startswith('win')


class SimpleLogger(logging.Logger):
    """
        >>> from simple_loggers import SimpleLogger
        >>> logger = SimpleLogger(colored=True)
        >>> logger.info('info message ...')
        >>> logger = SimpleLogger(logfile='run.log', level=10)
        >>> logger.info('info message ...')
    """
    def __init__(self,
                 name=None,
                 level=logging.DEBUG,
                 fmt='[%(asctime)s %(name)s %(funcName)s %(levelname)s %(threadName)s:%(lineno)s] %(message)s',
                 datefmt='%Y-%m-%d %H:%M:%S',
                 logfile=None,
                 filemode='w',
                 stream=sys.stderr,
                 colored=True,
                 debug=False,
                 **kwargs):

        if debug:
            level = logging.DEBUG
        elif type(level) == str:
            level = self.level_maps.get(level.lower(), 10)

        super(SimpleLogger, self).__init__(name, level)

        self.formatter = logging.Formatter(fmt, datefmt)

        if logfile:
            self._addFilehandler(logfile, filemode)
        else:
            self._addStreamHandler(stream)
            if colored and NOT_WINDOWS:
                coloredlogs.install(fmt=fmt, level=level, logger=self)

    def _addFilehandler(self, filename, filemode):

        file_hdlr = logging.FileHandler(filename, filemode)
        file_hdlr.setFormatter(self.formatter)
        self.addHandler(file_hdlr)

    def _addStreamHandler(self, stream):

        stream_hdlr = logging.StreamHandler(stream)
        stream_hdlr.setFormatter(self.formatter)
        self.addHandler(stream_hdlr)

    @property
    def level_maps(self):
        levels = {
            'debug': 10,
            'info': 20,
            'warn': 30,
            'warning': 30,
            'error': 40,
            'fatal': 50,
            'critical': 50,
        }
        return levels


if __name__ == '__main__':

    logger = SimpleLogger(colored=True)
    logger.debug('debug message')
    logger.info('info message')
    logger.warning('warn message')
    logger.error('error message')

    logger2 = SimpleLogger(name='TEST2', colored=False, logfile='out.log')
    logger2.debug('debug message')
    logger2.info('info message')
    logger2.warning('warn message')
    logger2.error('error message')

    logger3 = SimpleLogger(name='TEST3', level='info', fmt='%(asctime)s %(levelname)s: %(message)s')
    logger3.debug('debug message')
    logger3.info('info message')
    logger3.warning('warn message')
    logger3.error('error message')