Logger

This module contains functionality related to the the logger module for core.

Logger

LoggerConfiguration

Utility class for configuring application-wide logging.

This class provides methods to create consistently configured loggers, manage log levels, and control the behavior of third-party loggers. It uses the log level settings from MetadataConfiguration by default.

Attributes:
  • LOG_FORMAT

    The format string used for log messages

  • log_level (LogLevelName) –

    The application-wide log level (cached from configuration)

Source code in src/core/logger.py
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
class LoggerConfiguration:
    """Utility class for configuring application-wide logging.

    This class provides methods to create consistently configured loggers,
    manage log levels, and control the behavior of third-party loggers.
    It uses the log level settings from MetadataConfiguration by default.

    Attributes:
        LOG_FORMAT: The format string used for log messages
        log_level: The application-wide log level (cached from configuration)
    """

    LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"

    log_level: LogLevelName = None

    @classmethod
    def get_logger(
        cls, name: str, log_level: LogLevelName = None, propagate: bool = False
    ) -> logging.Logger:
        """Create a logger with specified configuration.

        Args:
            name: Name for the logger (typically __name__)
            log_level: Logging level
            propagate: Whether to propagate to parent loggers

        Returns:
            logging.Logger: Configured logger instance
        """
        if not log_level:
            log_level = cls.get_log_level()

        logger = logging.getLogger(name)
        logger.setLevel(cls.log_level.value_as_int)
        logger.propagate = propagate

        if not logger.handlers:
            formatter = logging.Formatter(cls.LOG_FORMAT)
            handler = logging.StreamHandler(sys.stdout)
            handler.setFormatter(formatter)
            logger.addHandler(handler)

        return logger

    @classmethod
    def get_log_level(cls) -> LogLevelName:
        """Get the log level for the logger.

        Returns:
            LogLevelName: The log level for the logger
        """
        if not cls.log_level:
            metadata = MetadataConfiguration()
            cls.log_level = metadata.log_level
        return cls.log_level

    @staticmethod
    def mute_logs():
        """Suppress verbose logs from third-party libraries.

        Sets appropriate log levels for various libraries to reduce log noise:
        - Sets 'httpx' to WARNING level
        - Sets 'pdfminer' to ERROR level
        """
        # Warning logs
        logging.getLogger("httpx").setLevel(logging.WARNING)

        # Error logs
        logging.getLogger("pdfminer").setLevel(logging.ERROR)

get_log_level() classmethod

Get the log level for the logger.

Returns:
  • LogLevelName( LogLevelName ) –

    The log level for the logger

Source code in src/core/logger.py
52
53
54
55
56
57
58
59
60
61
62
@classmethod
def get_log_level(cls) -> LogLevelName:
    """Get the log level for the logger.

    Returns:
        LogLevelName: The log level for the logger
    """
    if not cls.log_level:
        metadata = MetadataConfiguration()
        cls.log_level = metadata.log_level
    return cls.log_level

get_logger(name, log_level=None, propagate=False) classmethod

Create a logger with specified configuration.

Parameters:
  • name (str) –

    Name for the logger (typically name)

  • log_level (LogLevelName, default: None ) –

    Logging level

  • propagate (bool, default: False ) –

    Whether to propagate to parent loggers

Returns:
  • Logger

    logging.Logger: Configured logger instance

Source code in src/core/logger.py
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@classmethod
def get_logger(
    cls, name: str, log_level: LogLevelName = None, propagate: bool = False
) -> logging.Logger:
    """Create a logger with specified configuration.

    Args:
        name: Name for the logger (typically __name__)
        log_level: Logging level
        propagate: Whether to propagate to parent loggers

    Returns:
        logging.Logger: Configured logger instance
    """
    if not log_level:
        log_level = cls.get_log_level()

    logger = logging.getLogger(name)
    logger.setLevel(cls.log_level.value_as_int)
    logger.propagate = propagate

    if not logger.handlers:
        formatter = logging.Formatter(cls.LOG_FORMAT)
        handler = logging.StreamHandler(sys.stdout)
        handler.setFormatter(formatter)
        logger.addHandler(handler)

    return logger

mute_logs() staticmethod

Suppress verbose logs from third-party libraries.

Sets appropriate log levels for various libraries to reduce log noise: - Sets 'httpx' to WARNING level - Sets 'pdfminer' to ERROR level

Source code in src/core/logger.py
64
65
66
67
68
69
70
71
72
73
74
75
76
@staticmethod
def mute_logs():
    """Suppress verbose logs from third-party libraries.

    Sets appropriate log levels for various libraries to reduce log noise:
    - Sets 'httpx' to WARNING level
    - Sets 'pdfminer' to ERROR level
    """
    # Warning logs
    logging.getLogger("httpx").setLevel(logging.WARNING)

    # Error logs
    logging.getLogger("pdfminer").setLevel(logging.ERROR)