Only format file log, add tests
This commit is contained in:
parent
e42aaf2547
commit
013341272e
2 changed files with 56 additions and 15 deletions
|
|
@ -52,8 +52,8 @@ 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]%(invocation_id_str)s %(message)s"
|
||||
OFM_HANDLER.setFormatter(OFMConsoleFormatter(ofm_format_str))
|
||||
ofm_format_str = "[%(asctime)s] [%(levelname)s] %(message)s"
|
||||
OFM_HANDLER.setFormatter(logging.Formatter(ofm_format_str))
|
||||
OFM_HANDLER.addFilter(UvicornAccessFilter())
|
||||
OFM_HANDLER.addFilter(inject_invocation_id)
|
||||
OFM_HANDLER.level = root_logger.level
|
||||
|
|
@ -120,7 +120,10 @@ def retrieve_log_from_file() -> PlainTextResponse:
|
|||
|
||||
|
||||
class OFMLogFileFormatter(logging.Formatter):
|
||||
"""The formatter used for the OpenFlexure Microscope Server log file."""
|
||||
"""The formatter used for the OpenFlexure Microscope Server log file.
|
||||
|
||||
This is the log that is then read by the GUI.
|
||||
"""
|
||||
|
||||
def format(self, record: logging.LogRecord) -> str:
|
||||
"""Adjust the logging formatting for uvicorn logs.
|
||||
|
|
@ -131,6 +134,11 @@ class OFMLogFileFormatter(logging.Formatter):
|
|||
such as server start up. This can lead to people erroneously thinking that
|
||||
there is an error with their miroscope.
|
||||
"""
|
||||
invocation_id = getattr(record, "invocation_id", None)
|
||||
record.invocation_id_str = (
|
||||
f" [invocation:{invocation_id}]" if invocation_id else ""
|
||||
)
|
||||
|
||||
if record.name == "uvicorn.error" and record.levelno < logging.ERROR:
|
||||
record.name = "uvicorn"
|
||||
return super().format(record)
|
||||
|
|
@ -188,16 +196,4 @@ 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()
|
||||
|
|
|
|||
|
|
@ -234,3 +234,48 @@ def test_configure_logging_debug_mode(debug_flag, expected_level):
|
|||
# Cleanup: Remove the OFM_HANDLER from the root logger so it doesn't
|
||||
# interfere with other tests in the suite.
|
||||
root_logger.removeHandler(ofm_logging.OFM_HANDLER)
|
||||
|
||||
|
||||
def test_log_file_formatter_includes_invocation_id():
|
||||
"""Check that invocation IDs are included in logs when available."""
|
||||
formatter = ofm_logging.OFMLogFileFormatter(
|
||||
"[%(levelname)s]%(invocation_id_str)s %(message)s"
|
||||
)
|
||||
|
||||
record = logging.LogRecord(
|
||||
name="test",
|
||||
level=logging.INFO,
|
||||
pathname="",
|
||||
lineno=0,
|
||||
msg="Test message",
|
||||
args=(),
|
||||
exc_info=None,
|
||||
)
|
||||
record.invocation_id = "abc123"
|
||||
|
||||
formatted = formatter.format(record)
|
||||
|
||||
assert "[invocation:abc123]" in formatted
|
||||
assert "Test message" in formatted
|
||||
|
||||
|
||||
def test_log_file_formatter_without_invocation_id():
|
||||
"""Check that logs without invocation IDs still format correctly."""
|
||||
formatter = ofm_logging.OFMLogFileFormatter(
|
||||
"[%(levelname)s]%(invocation_id_str)s %(message)s"
|
||||
)
|
||||
|
||||
record = logging.LogRecord(
|
||||
name="test",
|
||||
level=logging.INFO,
|
||||
pathname="",
|
||||
lineno=0,
|
||||
msg="Test message",
|
||||
args=(),
|
||||
exc_info=None,
|
||||
)
|
||||
|
||||
formatted = formatter.format(record)
|
||||
|
||||
assert "[invocation:" not in formatted
|
||||
assert "Test message" in formatted
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue