from typing import Set
import logging
from sys import stdout
_LOGGERS: Set[str] = set()
_LOG_FMT = "[%(levelname)s] %(name)s: %(message)s"
_LOGGER_DEFAULT_HANDLER = logging.StreamHandler(stream=stdout)
_LOG_LEVEL: int = logging.INFO
_LOGGER_NAME_PREFIX = "AutoSettings."
def init_logger(level: int):
global _LOG_LEVEL, _LOG_FILE
_LOG_LEVEL = level
for name in _LOGGERS:
logger_name = f"{_LOGGER_NAME_PREFIX}{name}"
logger = logging.getLogger(name=logger_name)
logger.setLevel(_LOG_LEVEL)
for handler in logger.handlers:
handler.setFormatter(logging.Formatter(fmt=_LOG_FMT))
def get_logger(name: str) -> logging.Logger:
global _LOGGERS
logger_name = f"{_LOGGER_NAME_PREFIX}{name}"
if name not in _LOGGERS:
logger = logging.getLogger(name=logger_name)
logger.propagate = False
logger.setLevel(_LOG_LEVEL)
if not logger.handlers:
logger.addHandler(_LOGGER_DEFAULT_HANDLER)
for handler in logger.handlers:
handler.setFormatter(logging.Formatter(fmt=_LOG_FMT))
_LOGGERS.add(name)
return logging.getLogger(logger_name)
def change_stream_handler(logger, new_stream, old_stream='default'):
for handler in logger.handlers[:]:
if isinstance(handler, logging.StreamHandler):
logger.removeHandler(handler)
new_handler = logging.StreamHandler(stream=new_stream)
new_handler.setFormatter(logging.Formatter(fmt=_LOG_FMT))
logger.addHandler(new_handler)
return logger