diff --git a/src/openflexure_microscope_server/logging.py b/src/openflexure_microscope_server/logging.py index 38ad3848..40709fa8 100644 --- a/src/openflexure_microscope_server/logging.py +++ b/src/openflexure_microscope_server/logging.py @@ -19,6 +19,8 @@ from typing import Optional from fastapi import HTTPException from fastapi.responses import PlainTextResponse +from labthings_fastapi.logs import inject_invocation_id + LOGGER = logging.getLogger(__name__) OFM_LOG_FILE: Optional[str] = None @@ -50,9 +52,10 @@ def configure_logging(log_folder: str, debug: bool = False) -> None: # Add OFM_HANDLER first so it can capture the error log if the # log file can't be accessed. - ofm_format_str = "[%(asctime)s] [%(levelname)s] %(message)s" - OFM_HANDLER.setFormatter(logging.Formatter(ofm_format_str)) + ofm_format_str = "[%(asctime)s] [%(levelname)s]%(invocation_id_str)s %(message)s" + OFM_HANDLER.setFormatter(OFMConsoleFormatter(ofm_format_str)) OFM_HANDLER.addFilter(UvicornAccessFilter()) + OFM_HANDLER.addFilter(inject_invocation_id) OFM_HANDLER.level = root_logger.level root_logger.addHandler(OFM_HANDLER) @@ -65,9 +68,12 @@ def configure_logging(log_folder: str, debug: bool = False) -> None: maxBytes=1000000, backupCount=10, ) - format_str = "[%(asctime)s] [%(levelname)s] <%(name)s> %(message)s" + format_str = ( + "[%(asctime)s] [%(levelname)s] <%(name)s>%(invocation_id_str)s %(message)s" + ) handler.setFormatter(OFMLogFileFormatter(format_str)) handler.addFilter(UvicornAccessFilter()) + handler.addFilter(inject_invocation_id) root_logger.addHandler(handler) except PermissionError as e: @@ -182,4 +188,16 @@ class UvicornAccessFilter(logging.Filter): return not record.name.startswith("uvicorn.access") +class OFMConsoleFormatter(logging.Formatter): + """Formatter for OFM_HANDLER (the UI-facing log).""" + + def format(self, record: logging.LogRecord) -> str: + """Render the invocation ID into the record, if present.""" + invocation_id = getattr(record, "invocation_id", None) + record.invocation_id_str = ( + f" [invocation:{invocation_id}]" if invocation_id else "" + ) + return super().format(record) + + OFM_HANDLER = OFMHandler()