Module pyboiler.logging

Threaded logger with color support

Expand source code
"""Threaded logger with color support"""

from .internal.log import Handler, Level, Record, handlers


class logging:

    __slots__ = ("name", "_level", "handlers", "disabled")

    def __init__(self, name, level):
        self.name = name
        self._level = Level.get(level)
        self.handlers = dict()
        self.disabled = False

    @property
    def level(self):
        """Get logging level"""
        return self._level

    @level.setter
    def level(self, level):
        self._level = level

    @staticmethod
    def avail_handlers():
        return list(handlers.keys())

    @staticmethod
    def avail_levels():
        return list(Level)

    def mk_handler(self, handler, *args, **kwargs):  # type: ignore
        """Add a handler"""
        if isinstance(handler, str):
            handler: Handler = handlers[handler.lower()]
        else:
            if issubclass(handler, Handler):
                self.handlers[handler.name()] = handler
                return
        if not issubclass(handler, Handler):  # type: ignore
            raise Exception(f"Invalid handler: {handler}")

        if not handler in self.handlers:
            self.handlers[handler.name()] = handler(*args, **kwargs)

    def rm_handler(self, hdlr):
        """Remove a handler"""
        if isinstance(hdlr, str):
            hdlr = handlers[hdlr]
        self.handlers.pop(hdlr)

    def ls_handlers(self):
        """Return all available handlers"""
        return self.handlers

    def trace(self, msg):
        """Log trace"""
        self._log(Level.TRACE, msg)

    def debug(self, msg):
        """Log debug"""
        self._log(Level.DEBUG, msg)

    def info(self, msg):
        """Log info"""
        self._log(Level.INFO, msg)

    def warn(self, msg):
        """Log warn"""
        self._log(Level.WARN, msg)

    def error(self, msg):
        """Log error"""
        self._log(Level.ERROR, msg)

    def exception(self, msg):
        """Log error and raise an exception"""
        pass

    def log(self, lvl: Level, msg: str):
        """This probably shouldn't be used in your code"""
        self._log(lvl, msg)

    def _log(self, lvl: Level, msg: str):
        """logging internal method"""
        if Level.get(lvl) < self._level:
            return
        record = Record(self.name, lvl, msg, depth=3)
        self.handle(record)

    def handle(self, record: Record):
        if self.disabled:
            return
        for handler in self.handlers.values():
            handler.handle(record)

Classes

class logging (name, level)
Expand source code
class logging:

    __slots__ = ("name", "_level", "handlers", "disabled")

    def __init__(self, name, level):
        self.name = name
        self._level = Level.get(level)
        self.handlers = dict()
        self.disabled = False

    @property
    def level(self):
        """Get logging level"""
        return self._level

    @level.setter
    def level(self, level):
        self._level = level

    @staticmethod
    def avail_handlers():
        return list(handlers.keys())

    @staticmethod
    def avail_levels():
        return list(Level)

    def mk_handler(self, handler, *args, **kwargs):  # type: ignore
        """Add a handler"""
        if isinstance(handler, str):
            handler: Handler = handlers[handler.lower()]
        else:
            if issubclass(handler, Handler):
                self.handlers[handler.name()] = handler
                return
        if not issubclass(handler, Handler):  # type: ignore
            raise Exception(f"Invalid handler: {handler}")

        if not handler in self.handlers:
            self.handlers[handler.name()] = handler(*args, **kwargs)

    def rm_handler(self, hdlr):
        """Remove a handler"""
        if isinstance(hdlr, str):
            hdlr = handlers[hdlr]
        self.handlers.pop(hdlr)

    def ls_handlers(self):
        """Return all available handlers"""
        return self.handlers

    def trace(self, msg):
        """Log trace"""
        self._log(Level.TRACE, msg)

    def debug(self, msg):
        """Log debug"""
        self._log(Level.DEBUG, msg)

    def info(self, msg):
        """Log info"""
        self._log(Level.INFO, msg)

    def warn(self, msg):
        """Log warn"""
        self._log(Level.WARN, msg)

    def error(self, msg):
        """Log error"""
        self._log(Level.ERROR, msg)

    def exception(self, msg):
        """Log error and raise an exception"""
        pass

    def log(self, lvl: Level, msg: str):
        """This probably shouldn't be used in your code"""
        self._log(lvl, msg)

    def _log(self, lvl: Level, msg: str):
        """logging internal method"""
        if Level.get(lvl) < self._level:
            return
        record = Record(self.name, lvl, msg, depth=3)
        self.handle(record)

    def handle(self, record: Record):
        if self.disabled:
            return
        for handler in self.handlers.values():
            handler.handle(record)

Static methods

def avail_handlers()
Expand source code
@staticmethod
def avail_handlers():
    return list(handlers.keys())
def avail_levels()
Expand source code
@staticmethod
def avail_levels():
    return list(Level)

Instance variables

var disabled

Return an attribute of instance, which is of type owner.

var handlers

Return an attribute of instance, which is of type owner.

var level

Get logging level

Expand source code
@property
def level(self):
    """Get logging level"""
    return self._level
var name

Return an attribute of instance, which is of type owner.

Methods

def debug(self, msg)

Log debug

Expand source code
def debug(self, msg):
    """Log debug"""
    self._log(Level.DEBUG, msg)
def error(self, msg)

Log error

Expand source code
def error(self, msg):
    """Log error"""
    self._log(Level.ERROR, msg)
def exception(self, msg)

Log error and raise an exception

Expand source code
def exception(self, msg):
    """Log error and raise an exception"""
    pass
def handle(self, record: Record)
Expand source code
def handle(self, record: Record):
    if self.disabled:
        return
    for handler in self.handlers.values():
        handler.handle(record)
def info(self, msg)

Log info

Expand source code
def info(self, msg):
    """Log info"""
    self._log(Level.INFO, msg)
def log(self, lvl: Level, msg: str)

This probably shouldn't be used in your code

Expand source code
def log(self, lvl: Level, msg: str):
    """This probably shouldn't be used in your code"""
    self._log(lvl, msg)
def ls_handlers(self)

Return all available handlers

Expand source code
def ls_handlers(self):
    """Return all available handlers"""
    return self.handlers
def mk_handler(self, handler, *args, **kwargs)

Add a handler

Expand source code
def mk_handler(self, handler, *args, **kwargs):  # type: ignore
    """Add a handler"""
    if isinstance(handler, str):
        handler: Handler = handlers[handler.lower()]
    else:
        if issubclass(handler, Handler):
            self.handlers[handler.name()] = handler
            return
    if not issubclass(handler, Handler):  # type: ignore
        raise Exception(f"Invalid handler: {handler}")

    if not handler in self.handlers:
        self.handlers[handler.name()] = handler(*args, **kwargs)
def rm_handler(self, hdlr)

Remove a handler

Expand source code
def rm_handler(self, hdlr):
    """Remove a handler"""
    if isinstance(hdlr, str):
        hdlr = handlers[hdlr]
    self.handlers.pop(hdlr)
def trace(self, msg)

Log trace

Expand source code
def trace(self, msg):
    """Log trace"""
    self._log(Level.TRACE, msg)
def warn(self, msg)

Log warn

Expand source code
def warn(self, msg):
    """Log warn"""
    self._log(Level.WARN, msg)