Source code for app.util.logging.logger

# SPDX-License-Identifier: GPLv3-or-later
# Copyright © 2025 pygaindalf Rui Pinheiro

import logging

from typing import Any, override

from .loggable_protocol import LoggableProtocol


[docs] class Logger(logging.Logger):
[docs] @override def isEnabledFor(self, level: int, *, handler: str | None = None) -> bool: if handler is not None: if handler == "tty": return self.isEnabledForTty(level) elif handler == "file": return self.isEnabledForFile(level) else: msg = f"Unknown handler: {handler}. Expected 'tty' or 'file'." raise ValueError(msg) else: return super().isEnabledFor(level)
[docs] def isEnabledForTty(self, level: int) -> bool: # noqa: N802 which matches isEnabledFor from .manager import LoggingManager ch = LoggingManager().ch if ch is None or ch.level > level: return False return super().isEnabledFor(level)
[docs] def isEnabledForFile(self, level: int) -> bool: # noqa: N802 which matches isEnabledFor from .manager import LoggingManager fh = LoggingManager().fh if fh is None or fh.level > level: return False return super().isEnabledFor(level)
logging.setLoggerClass(Logger) # Helper for class constructors to obtain a logger object # Returns a logger object
[docs] def getLogger(obj: object, parent: Any = None, name: str | None = None) -> Logger: if name is None: if isinstance(obj, str): name = obj else: cls_name = type(obj).__name__ if isinstance(cls_name, str): name = cls_name else: msg = f"Cannot determine logger name from object: {obj}" raise TypeError(msg) logger = None if parent is None or not isinstance(parent, LoggableProtocol): logger = logging.getLogger(name) elif isinstance(parent, logging.Logger): logger = parent.getChild(name) else: logger = parent.log.getChild(name) if not isinstance(logger, Logger): msg = f"Expected a Logger instance, got: {type(logger)}" raise TypeError(msg) return logger