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: raise ValueError(f"Unknown handler: {handler}. Expected 'tty' or 'file'.") else: return super().isEnabledFor(level)
[docs] def isEnabledForTty(self, level: int) -> bool: 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: 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, parent:Any=None, name:str|None=None) -> Logger: if name is None: if isinstance(obj, str): name = obj else: cls_name = obj.__class__.__name__ if isinstance(cls_name, str): name = cls_name else: raise TypeError("Cannot determine logger name from object: {}".format(obj)) 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): raise TypeError("Expected a Logger instance, got: {}".format(type(logger))) return logger