Skip to content

logger

File: logger.py.

Description

This file contains the Logger class used for logging messages to the console and a log file.

Logger

Logger class to handle logging messages to both the console and a file.

Attributes:

Name Type Description
logger Logger

The logger instance used for logging messages.

Methods:

Name Description
info

str) -> None: Logs an informational message.

warning

str) -> None: Logs a warning message.

error

str) -> None: Logs an error message.

critical

str) -> None: Logs a critical message.

Source code in src/CryptoFraudDetection/utils/logger.py
class Logger:
    """
    Logger class to handle logging messages to both the console and a file.

    Attributes:
        logger (logging.Logger): The logger instance used for logging messages.

    Methods:
        info(message: str) -> None: Logs an informational message.
        warning(message: str) -> None: Logs a warning message.
        error(message: str) -> None: Logs an error message.
        critical(message: str) -> None: Logs a critical message.

    """

    def __init__(
        self,
        name: str,
        level: LoggerMode = LoggerMode.DEBUG,
        log_dir: str = "logs",
    ) -> None:
        """
        Initializes the Logger instance with the specified name, log level, and log directory.

        Args:
            name (str): The name of the logger, typically the name of the module or class.
            level (int, optional): The log level (default: LoggerMode.DEBUG).
            log_dir (str, optional): The directory where log files will be saved (default: "logs").

        """
        self.logger: logging.Logger = logging.getLogger(name)
        self.logger.setLevel(level.value)

        formatter = logging.Formatter(
            "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
        )

        # Set up console handler
        stream_handler: logging.StreamHandler = logging.StreamHandler()
        stream_handler.setFormatter(formatter)

        # Add handlers only if there are no existing handlers (to avoid duplication)
        if not self.logger.hasHandlers():
            self.logger.addHandler(stream_handler)

            # Create logs directory if it doesn't exist
            if not os.path.exists(log_dir):
                os.makedirs(log_dir)

            # Set up rotating file handler to handle log rotation and avoid large log files
            time: str = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
            file_handler: RotatingFileHandler = RotatingFileHandler(
                f"{log_dir}/{time}_{name}.log",
                maxBytes=1024 * 1024 * 5,
                backupCount=5,
            )
            file_handler.setFormatter(formatter)
            self.logger.addHandler(file_handler)

    def debug(self, message: str) -> None:
        """
        Logs a debug message.

        Args:
            message (str): The message to log.

        """
        self.logger.debug(message)

    def info(self, message: str) -> None:
        """
        Logs an informational message.

        Args:
            message (str): The message to log.

        """
        self.logger.info(message)

    def warning(self, message: str) -> None:
        """
        Logs a warning message.

        Args:
            message (str): The message to log.

        """
        self.logger.warning(message)

    def error(self, message: str) -> None:
        """
        Logs an error message.

        Args:
            message (str): The message to log.

        """
        self.logger.error(message)

    def critical(self, message: str) -> None:
        """
        Logs a critical message.

        Args:
            message (str): The message to log.

        """
        self.logger.critical(message)

    def handle_exception(
        self,
        exception_class: type[Exception],
        message: str,
        logger_level: str = "error",
    ) -> None:
        """
        Handles exception logging and raising.

        Args:
            exception_class (Exception): The class of the exception to raise.
            message (str): The error message to log and raise.
            logger_level (str): The logging level to use ("error", "warning", "info").
                Defaults to "error".

        """
        if logger_level == "error":
            self.logger.error(message)
            raise exception_class(message)
        if logger_level == "warning":
            self.logger.warning(message)
        elif logger_level == "info":
            self.logger.info(message)

__init__(name, level=LoggerMode.DEBUG, log_dir='logs')

Initializes the Logger instance with the specified name, log level, and log directory.

Parameters:

Name Type Description Default
name str

The name of the logger, typically the name of the module or class.

required
level int

The log level (default: LoggerMode.DEBUG).

DEBUG
log_dir str

The directory where log files will be saved (default: "logs").

'logs'
Source code in src/CryptoFraudDetection/utils/logger.py
def __init__(
    self,
    name: str,
    level: LoggerMode = LoggerMode.DEBUG,
    log_dir: str = "logs",
) -> None:
    """
    Initializes the Logger instance with the specified name, log level, and log directory.

    Args:
        name (str): The name of the logger, typically the name of the module or class.
        level (int, optional): The log level (default: LoggerMode.DEBUG).
        log_dir (str, optional): The directory where log files will be saved (default: "logs").

    """
    self.logger: logging.Logger = logging.getLogger(name)
    self.logger.setLevel(level.value)

    formatter = logging.Formatter(
        "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    )

    # Set up console handler
    stream_handler: logging.StreamHandler = logging.StreamHandler()
    stream_handler.setFormatter(formatter)

    # Add handlers only if there are no existing handlers (to avoid duplication)
    if not self.logger.hasHandlers():
        self.logger.addHandler(stream_handler)

        # Create logs directory if it doesn't exist
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)

        # Set up rotating file handler to handle log rotation and avoid large log files
        time: str = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
        file_handler: RotatingFileHandler = RotatingFileHandler(
            f"{log_dir}/{time}_{name}.log",
            maxBytes=1024 * 1024 * 5,
            backupCount=5,
        )
        file_handler.setFormatter(formatter)
        self.logger.addHandler(file_handler)

critical(message)

Logs a critical message.

Parameters:

Name Type Description Default
message str

The message to log.

required
Source code in src/CryptoFraudDetection/utils/logger.py
def critical(self, message: str) -> None:
    """
    Logs a critical message.

    Args:
        message (str): The message to log.

    """
    self.logger.critical(message)

debug(message)

Logs a debug message.

Parameters:

Name Type Description Default
message str

The message to log.

required
Source code in src/CryptoFraudDetection/utils/logger.py
def debug(self, message: str) -> None:
    """
    Logs a debug message.

    Args:
        message (str): The message to log.

    """
    self.logger.debug(message)

error(message)

Logs an error message.

Parameters:

Name Type Description Default
message str

The message to log.

required
Source code in src/CryptoFraudDetection/utils/logger.py
def error(self, message: str) -> None:
    """
    Logs an error message.

    Args:
        message (str): The message to log.

    """
    self.logger.error(message)

handle_exception(exception_class, message, logger_level='error')

Handles exception logging and raising.

Parameters:

Name Type Description Default
exception_class Exception

The class of the exception to raise.

required
message str

The error message to log and raise.

required
logger_level str

The logging level to use ("error", "warning", "info"). Defaults to "error".

'error'
Source code in src/CryptoFraudDetection/utils/logger.py
def handle_exception(
    self,
    exception_class: type[Exception],
    message: str,
    logger_level: str = "error",
) -> None:
    """
    Handles exception logging and raising.

    Args:
        exception_class (Exception): The class of the exception to raise.
        message (str): The error message to log and raise.
        logger_level (str): The logging level to use ("error", "warning", "info").
            Defaults to "error".

    """
    if logger_level == "error":
        self.logger.error(message)
        raise exception_class(message)
    if logger_level == "warning":
        self.logger.warning(message)
    elif logger_level == "info":
        self.logger.info(message)

info(message)

Logs an informational message.

Parameters:

Name Type Description Default
message str

The message to log.

required
Source code in src/CryptoFraudDetection/utils/logger.py
def info(self, message: str) -> None:
    """
    Logs an informational message.

    Args:
        message (str): The message to log.

    """
    self.logger.info(message)

warning(message)

Logs a warning message.

Parameters:

Name Type Description Default
message str

The message to log.

required
Source code in src/CryptoFraudDetection/utils/logger.py
def warning(self, message: str) -> None:
    """
    Logs a warning message.

    Args:
        message (str): The message to log.

    """
    self.logger.warning(message)