Source code for my_logger

from __future__ import annotations
import logging
import sys
from typing import Union


[docs] def setup_logger(logger: Union[str, logging.Logger], is_main: bool = None) -> logging.Logger: assert type(logger) in [str, logging.Logger], "Provided logger not " "correct type" class StdOutFilter(logging.Filter): def filter(self, record: logging.LogRecord): return record.levelno in (logging.DEBUG, logging.INFO, logging.WARNING) class StdErrFilter(logging.Filter): def filter(self, record: logging.LogRecord): return record.levelno not in (logging.DEBUG, logging.INFO, logging.WARNING) if type(logger) is str: logger = logging.getLogger(logger) if is_main: logger.root.handlers = [] line = "-" * 100 err_fmt = ( f"{line}\n%(asctime)s -> %(threadName)s -> %(module)s -> %(funcName)s(%(lineno)d): " f"%(message)s\n{line}" ) err_formatter = logging.Formatter(fmt=err_fmt) debug_fmt = f"%(asctime)s -> %(threadName)s -> %(module)s -> %(funcName)s: " f"%(message)s" debug_formatter = logging.Formatter(fmt=debug_fmt) cli_err = logging.StreamHandler(stream=sys.stderr) cli_err.setLevel(logging.ERROR) cli_err.setFormatter(err_formatter) cli_err.addFilter(StdErrFilter()) cli_out = logging.StreamHandler(stream=sys.stdout) cli_out.setLevel(logging.INFO) cli_out.setFormatter(debug_formatter) cli_out.addFilter(StdOutFilter()) file_log = logging.FileHandler(filename="log.txt", mode="w+") file_log.setLevel(logging.INFO) file_log.setFormatter(err_formatter) root_logger = logging.root root_logger.setLevel(logging.ERROR) root_logger.addHandler(cli_err) logger.setLevel(logging.DEBUG) logger.addHandler(cli_out) num_args = len(sys.argv) - 1 if num_args == 0 or (num_args > 0 and "--dev" not in sys.argv): root_logger.addHandler(file_log) if num_args and ("--dev" in sys.argv or "--debug" in sys.argv): cli_out.setLevel(logging.DEBUG) logger.setLevel(logging.DEBUG) return logger