+
+ }
+ onChange={(event) => setFilterInput(event.target.value)}
+ placeholder="Filter by level or message…"
+ value={filterInput}
+ />
+
+ {
+ setPageNum(0);
+ setPageSize(Number(event.target.value));
+ }}
+ options={PAGE_SIZE_OPTIONS}
+ style={{ width: 96 }}
+ value={String(pageSize)}
+ />
+ }
+ variant="secondary"
+ >
+ Refresh
+
+
+
+ {state.status === 'error' && (
+
+
+ {state.error}
+
+
+ Retry
+
+
+ )}
+
+
+ {state.status === 'loading' ? (
+
+
+ Loading logs…
+
+ ) : state.entries.length === 0 ? (
+
+ {filter ? 'No log entries match this filter.' : 'No log entries found.'}
+
+ ) : (
+
+
+
+
+
+ Timestamp
+ Level
+ Message
+
+
+
+ {state.entries.map((entry, index) => (
+
+
+ {formatTimestamp(entry.timestamp)}
+
+
+ {entry.level}
+
+ {entry.message}
+
+ ))}
+
+
+
+
+
+ {state.totalCount} entr{state.totalCount === 1 ? 'y' : 'ies'}
+ {filter ? ` matching "${filter}"` : ''}
+
+
+ setPageNum((current) => Math.max(0, current - 1))}
+ size="sm"
+ title="Previous page"
+ >
+
+
+
+ Page {pageNum + 1} of {totalPages}
+
+ = totalPages}
+ onClick={() => setPageNum((current) => current + 1)}
+ size="sm"
+ title="Next page"
+ >
+
+
+
+
+ )}
+
+
+
+
+
+ Logs are read from the current server log file. Older, rotated log files aren't available here — check the
+ config folder's logs directory for history.
+
+
+
+ );
+}
diff --git a/web/src/screens/SettingsScreen.tsx b/web/src/screens/SettingsScreen.tsx
index e087cb62f..ec4869acb 100644
--- a/web/src/screens/SettingsScreen.tsx
+++ b/web/src/screens/SettingsScreen.tsx
@@ -854,12 +854,22 @@ function SystemPane({
Open Dashboard
-