Source code for isek.utils.log
import sys
import logging
from threading import Lock
from rich.logging import RichHandler
[docs]
class InfoOnlyFilter(logging.Filter):
[docs]
def filter(self, record):
return record.levelno == logging.INFO
[docs]
class LoggerManager:
_instance = None
_lock = Lock()
def __new__(cls, *args, **kwargs):
with cls._lock:
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self, mode: str, level):
if mode == "debug":
self._setup_debug_logger(level)
else:
self._setup_plain_logger(level)
def _setup_debug_logger(self, level: str):
logger = logging.getLogger("isek")
logger.setLevel(level)
logger.handlers.clear()
handler = logging.StreamHandler(sys.stdout)
log_format = "%(asctime)s | %(levelname)s | %(filename)s:%(funcName)s:%(lineno)d | %(message)s"
handler.setFormatter(logging.Formatter(log_format, datefmt="%Y-%m-%d %H:%M:%S"))
logger.addHandler(handler)
logger.propagate = False
def _setup_plain_logger(self, level: str):
handler = RichHandler(
rich_tracebacks=True,
markup=True,
show_path=False,
show_time=False,
show_level=True,
)
handler.addFilter(InfoOnlyFilter())
handler.setFormatter(logging.Formatter("[blue]%(message)s[/]", datefmt="[%X]"))
logger = logging.getLogger("isek")
logger.setLevel(level)
logger.handlers.clear()
logger.addHandler(handler)
logger.propagate = False
[docs]
@classmethod
def plain_mode(cls, level="INFO"):
return cls(mode="plain", level=level)
[docs]
@classmethod
def debug_mode(cls, level="DEBUG"):
return cls(mode="debug", level=level)
[docs]
@staticmethod
def get_logger():
return logging.getLogger("isek")
LoggerManager.plain_mode()
log = LoggerManager.get_logger()