Source code for libdebug.liblog
#
# This file is part of libdebug Python library (https://github.com/libdebug/libdebug).
# Copyright (c) 2023-2024 Gabriele Digregorio. All rights reserved.
# Licensed under the MIT license. See LICENSE file in the project root for details.
#
from __future__ import annotations
import logging
from libdebug.utils.print_style import PrintStyle
[docs]
class LibLog:
    """Custom logger singleton class that can be used to log messages to the console."""
    _instance = None
    def __new__(cls: type):
        """Create a new instance of the class if it does not exist yet.
        Returns:
            LibLog: the instance of the class.
        """
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            cls._instance._initialized = False
        return cls._instance
    def __init__(self: LibLog) -> None:
        """Initializes the logger."""
        if self._initialized:
            return
        # General logger
        self.general_logger = self._setup_logger("libdebug", logging.INFO)
        # Component-specific loggers
        self.debugger_logger = self._setup_logger("debugger", logging.INFO)
        self.pipe_logger = self._setup_logger("pipe", logging.INFO)
        self._initialized = True
    def _setup_logger(self: LibLog, name: str, level: int) -> logging.Logger:
        """Setup a logger with the given name and level.
        Args:
            name (str): name of the logger.
            level (int): logging level.
        Returns:
            logging.Logger: the logger object.
        """
        logger = logging.getLogger(name)
        logger.setLevel(level)
        handler = logging.StreamHandler()
        formatter = logging.Formatter("%(message)s")
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        return logger
[docs]
    def debugger(self: LibLog, message: str, *args: str, **kwargs: str) -> None:
        """Log a message to the debugger logger.
        Args:
            message (str): the message to log.
            *args: positional arguments to pass to the logger.
            **kwargs: keyword arguments to pass to the logger.
        """
        header = f"[{PrintStyle.RED}DEBUGGER{PrintStyle.DEFAULT_COLOR}]"
        self.debugger_logger.debug(f"{header} {message}", *args, **kwargs) 
[docs]
    def pipe(self: LibLog, message: str, *args: str, **kwargs: str) -> None:
        """Log a message to the pipe logger.
        Args:
            message (str): the message to log.
            *args: positional arguments to pass to the logger.
            **kwargs: keyword arguments to pass to the logger.
        """
        header = f"[{PrintStyle.BLUE}PIPE{PrintStyle.DEFAULT_COLOR}]"
        self.pipe_logger.debug(f"{header} {message}", *args, **kwargs) 
[docs]
    def info(self: LibLog, message: str, *args: str, **kwargs: str) -> None:
        """Log a info message to the general logger.
        Args:
            message (str): the message to log.
            *args: positional arguments to pass to the logger.
            **kwargs: keyword arguments to pass to the logger.
        """
        header = f"[{PrintStyle.GREEN}INFO{PrintStyle.DEFAULT_COLOR}]"
        self.general_logger.info(f"{header} {message}", *args, **kwargs) 
[docs]
    def warning(self: LibLog, message: str, *args: str, **kwargs: str) -> None:
        """Log a warning message to the general logger.
        Args:
            message (str): the message to log.
            *args: positional arguments to pass to the logger.
            **kwargs: keyword arguments to pass to the logger.
        """
        header = f"[{PrintStyle.BRIGHT_YELLOW}WARNING{PrintStyle.DEFAULT_COLOR}]"
        self.general_logger.warning(f"{header} {message}", *args, **kwargs) 
[docs]
    def error(self: LibLog, message: str, *args: str, **kwargs: str) -> None:
        """Log an error message to the general logger.
        Args:
            message (str): the message to log.
            *args: positional arguments to pass to the logger.
            **kwargs: keyword arguments to pass to the logger.
        """
        header = f"[{PrintStyle.RED}ERROR{PrintStyle.DEFAULT_COLOR}]"
        self.general_logger.error(f"{header} {message}", *args, **kwargs) 
 
# Create the logger instance
liblog = LibLog()