Add "lines" and "verbose" query parameters for advanced logs (#5287)

Since headers are clumsy considering the Core proxy between the frontend
and Supervisor, add a way to adjust number of lines and verbose log
format using query parameters as well. If both query parameters and
headers are supplied, prefer the former, as it's more prominent when
reading through the request logs.
This commit is contained in:
Jan Čermák 2024-09-04 16:11:37 +02:00 committed by GitHub
parent 6c1203e4bf
commit 05e0c7c3ab
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 51 additions and 2 deletions

View File

@ -222,10 +222,14 @@ class APIHost(CoreSysAttributes):
"supported for now." "supported for now."
) )
if request.headers[ACCEPT] == CONTENT_TYPE_X_LOG: if "verbose" in request.query or request.headers[ACCEPT] == CONTENT_TYPE_X_LOG:
log_formatter = LogFormatter.VERBOSE log_formatter = LogFormatter.VERBOSE
if RANGE in request.headers: if "lines" in request.query:
lines = request.query.get("lines", DEFAULT_RANGE)
# entries=cursor[[:num_skip]:num_entries]
range_header = f"entries=:-{lines}:"
elif RANGE in request.headers:
range_header = request.headers.get(RANGE) range_header = request.headers.get(RANGE)
else: else:
range_header = f"entries=:-{DEFAULT_RANGE}:" range_header = f"entries=:-{DEFAULT_RANGE}:"

View File

@ -238,6 +238,51 @@ async def test_advanced_logs(
) )
async def test_advaced_logs_query_parameters(
api_client: TestClient,
coresys: CoreSys,
journald_logs: MagicMock,
journal_logs_reader: MagicMock,
):
"""Test advanced logging API entries controlled by query parameters."""
# Check lines query parameter
await api_client.get("/host/logs?lines=53")
journald_logs.assert_called_once_with(
params={"SYSLOG_IDENTIFIER": coresys.host.logs.default_identifiers},
range_header="entries=:-53:",
accept=LogFormat.JOURNAL,
)
journald_logs.reset_mock()
# Check verbose logs formatter via query parameter
await api_client.get("/host/logs?verbose")
journald_logs.assert_called_once_with(
params={"SYSLOG_IDENTIFIER": coresys.host.logs.default_identifiers},
range_header=DEFAULT_RANGE,
accept=LogFormat.JOURNAL,
)
journal_logs_reader.assert_called_with(ANY, LogFormatter.VERBOSE)
journal_logs_reader.reset_mock()
journald_logs.reset_mock()
# Query parameters should take precedence over headers
await api_client.get(
"/host/logs?lines=53&verbose",
headers={
"Range": "entries=:-19:10",
"Accept": "text/plain",
},
)
journald_logs.assert_called_once_with(
params={"SYSLOG_IDENTIFIER": coresys.host.logs.default_identifiers},
range_header="entries=:-53:",
accept=LogFormat.JOURNAL,
)
journal_logs_reader.assert_called_with(ANY, LogFormatter.VERBOSE)
async def test_advanced_logs_boot_id_offset( async def test_advanced_logs_boot_id_offset(
api_client: TestClient, coresys: CoreSys, journald_logs: MagicMock api_client: TestClient, coresys: CoreSys, journald_logs: MagicMock
): ):