log: using filters to separate server and task logs from the rest

This commit is contained in:
Mose Müller 2025-02-28 15:43:24 +01:00
parent f2183ec3e4
commit 3d13b20fda

View File

@ -29,32 +29,44 @@ LOGGING_CONFIG = {
"datefmt": "%Y-%m-%d %H:%M:%S", "datefmt": "%Y-%m-%d %H:%M:%S",
}, },
}, },
"handlers": { "filters": {
"default": { "only_pydase_server_or_task": {
"formatter": "default", "()": "pydase.utils.logging.NameFilter",
"class": "logging.StreamHandler", "matches": ["pydase.server", "pydase.task"],
"stream": "ext://sys.stderr",
}, },
"stdout": { "exclude_pydase_server_and_task": {
"()": "pydase.utils.logging.NameFilter",
"matches": ["pydase.server", "pydase.task"],
"invert": True,
},
},
"handlers": {
"stdout_handler": {
"formatter": "default", "formatter": "default",
"class": "logging.StreamHandler", "class": "logging.StreamHandler",
"stream": "ext://sys.stdout", "stream": "ext://sys.stdout",
"filters": ["only_pydase_server_or_task"],
},
"stderr_handler": {
"formatter": "default",
"class": "logging.StreamHandler",
"stream": "ext://sys.stderr",
"filters": ["exclude_pydase_server_and_task"],
}, },
}, },
"loggers": { "loggers": {
"pydase.server": { "pydase": {
"handlers": ["stdout"], "handlers": ["stdout_handler", "stderr_handler"],
"level": LOG_LEVEL, "level": LOG_LEVEL,
"propagate": False, "propagate": False,
}, },
"pydase": {"handlers": ["default"], "level": LOG_LEVEL, "propagate": False},
"aiohttp_middlewares": { "aiohttp_middlewares": {
"handlers": ["default"], "handlers": ["stderr_handler"],
"level": logging.WARNING, "level": logging.WARNING,
"propagate": False, "propagate": False,
}, },
"aiohttp": { "aiohttp": {
"handlers": ["default"], "handlers": ["stderr_handler"],
"level": logging.INFO, "level": logging.INFO,
"propagate": False, "propagate": False,
}, },
@ -62,6 +74,23 @@ LOGGING_CONFIG = {
} }
class NameFilter(logging.Filter):
"""
Logging filter that allows filtering logs based on the logger name.
Can either include or exclude a specific logger.
"""
def __init__(self, matches: list[str], invert: bool = False):
super().__init__()
self.matches = matches
self.invert = invert
def filter(self, record: logging.LogRecord) -> bool:
if self.invert:
return not any(record.name.startswith(match) for match in self.matches)
return any(record.name.startswith(match) for match in self.matches)
class DefaultFormatter(logging.Formatter): class DefaultFormatter(logging.Formatter):
""" """
A custom log formatter class that: A custom log formatter class that: