Source code for mylogging.my_logging.logger_module
"""Module with functionality for 'logger' subpackage."""
from __future__ import annotations
from typing import Union, Any
import logging
from pathlib import Path
from typing_extensions import Literal
from ..colors import colorize
[docs]class MyLogger:
"""Logger class use python logger and define it in specific way. It contains some filters
and formatters."""
def __init__(self) -> None:
"""Define some variables, that are then assigned in init_formatter when config change."""
self.formatter_file_str: str
self.formatter_console_str: str
self.output: Union[str, Path, None]
self.level: Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
self.formatter_file_str: str
self.stream: Any
self.to_list: Union[None, list[str]]
self.datefmt = "%Y-%m-%d %H:%M"
self.logger = logging.getLogger("application")
self.logger.addFilter(self.ContextFilter())
[docs] def get_handler(self) -> None:
"""Prepare logger handler.
If formatter_file_str, formatter_console_str or output change, it need new handler. First update new
value in logger object, then call this function.
"""
while self.logger.handlers:
self.logger.removeHandler(self.logger.handlers[0])
if self.stream is not None:
handler = logging.StreamHandler(stream=self.stream)
handler.setFormatter(self.get_formatter(self.formatter_console_str))
# handler.setLevel(getattr(logging, self.level))
self.logger.addHandler(handler)
if self.output == "console":
handler = logging.StreamHandler()
handler.setFormatter(self.get_formatter(self.formatter_console_str))
# handler.setLevel(getattr(logging, self.level))
self.logger.addHandler(handler)
elif self.output:
handler = logging.FileHandler(self.output)
handler.setFormatter(self.get_formatter(self.formatter_file_str))
# handler.setLevel(getattr(logging, self.level))
self.logger.addHandler(handler)
if isinstance(self.to_list, list):
handler = self.SaveHandler(self.to_list)
self.logger.addHandler(handler)
[docs] class ContextFilter(logging.Filter):
"""Class with logging filter that format output message."""
[docs] def filter(self, record):
"""Logging filter that format output message."""
record.funcName = "" if record.funcName == "<module>" else f"in function {record.funcName}"
record.levelname = colorize(record.levelname, record.levelname)
return True
[docs] class SaveHandler(logging.Handler):
"""Enable to save logs to python list so it can be logged later elsewhere."""
def __init__(self, to_list) -> None:
self.to_list = to_list
super().__init__()
[docs] def emit(self, record) -> None:
self.to_list.append(record)
my_logger = MyLogger()
"""Logger object is python logger defined in a specific way. It contains some filters and formatters."""