Source code for ds_stoa.utils.logger._logger
"""DS-Stoa Logger."""
import logging
import sys
import tempfile
from typing import Optional
from ._context import ContextFilter, FolderNameFilter
[docs]
class StoaLogger:
"""
Setup logger for ds-stoa package.
Usage:
from ds_stoa.utils import LOGGER
LOGGER.info("This is an info message.")
LOGGER.warning("This is a warning message.")
LOGGER.error("This is an error message.")
LOGGER.debug("This is a debug message.")
"""
LOGGER = logging.getLogger("STOA")
FORMATER = logging.Formatter(
"[%(asctime)s][%(name)s][%(levelname)s][%(folder_name)s]"
"[%(funcName)s]: %(message)s",
"%Y-%m-%d %H:%M:%S",
)
def __init__(self, log_level=logging.DEBUG) -> None:
"""
Initialize the logger.
:param log_level: The level of the logger.
"""
self.LOGGER.setLevel(log_level)
self.LOGGER.addHandler(self._setup_stream_handler())
self._logger_file = None
[docs]
def setup_logger(self, prefix: str, with_file: bool = True) -> None:
"""
Instantiates logger with a handler and a log message prefix.
:param prefix: Prefix in log message.
:param with_file: Indicates if logger should also write to file.
:return: None
"""
# to avoid multithread access, clear the handler when setup
self.shutdown()
self.LOGGER.addHandler(self._setup_stream_handler(prefix))
if with_file:
log_file = tempfile.NamedTemporaryFile(delete=False).name
self.LOGGER.addHandler(self._setup_file_handler(log_file, prefix))
[docs]
def info(self, msg: str) -> None:
"""
Log an info level message.
:param msg: The message to log.
:return: None
"""
self.LOGGER.info(msg)
[docs]
def warning(self, msg: str) -> None:
"""
Log a warning level message.
:param msg: The message to log.
:return: None
"""
self.LOGGER.warning(msg)
[docs]
def error(self, msg: str) -> None:
"""
Log an error level message.
:param msg: The message to log.
:return: None
"""
self.LOGGER.error(msg)
[docs]
def debug(self, msg: str) -> None:
"""
Log a debug level message.
:param msg: The message to log.
:return: None
"""
self.LOGGER.debug(msg)
[docs]
@staticmethod
def shutdown() -> None:
"""
Shutdown the logger by removing all handlers.
:return: None
"""
StoaLogger.LOGGER.handlers = []
[docs]
def _setup_file_handler(
self,
log_file: str,
prefix: str,
) -> logging.FileHandler:
"""
Set up file handler for logger with logging prefix.
:param log_file: The file to log to.
:param prefix: The prefix for the log messages.
:return: The file handler.
"""
file_handler = logging.FileHandler(log_file)
file_handler.setFormatter(self.FORMATER)
file_handler.addFilter(ContextFilter(prefix))
file_handler.name = "log-file"
return file_handler
[docs]
def _setup_stream_handler(
self,
prefix: Optional[str] = None,
) -> logging.StreamHandler:
"""
Sets up stream handler for logger with logging prefix.
:param prefix: Prefix applied on every log to add context: Who!
:return: The stream handler.
"""
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setFormatter(self.FORMATER)
stream_handler.addFilter(FolderNameFilter())
stream_handler.addFilter(ContextFilter(prefix))
stream_handler.name = "log-console"
return stream_handler