fix(logs): fall back to default level filters when saved filters are invalid

Malformed JSON in the coolify-log-filters localStorage key threw during
runtime log viewer startup. Read the saved value safely and keep only
boolean values for known levels.

Fixes #12101
This commit is contained in:
Andras Bacsai
2026-10-08 13:39:26 +02:00
parent 44e4566a9b
commit f86a02f409
2 changed files with 38 additions and 1 deletions
+18 -1
View File
@@ -83,6 +83,23 @@ export function isFindShortcut(event) {
return Boolean(event.ctrlKey || event.metaKey) && !event.altKey && !event.shiftKey && event.key?.toLowerCase() === 'f';
}
const DEFAULT_LOG_FILTERS = { error: true, warning: true, debug: true, info: true };
/** Read saved level filters. Invalid saved values fall back to the defaults. */
export function readLogFilters(saved) {
const filters = { ...DEFAULT_LOG_FILTERS };
let parsed;
try {
parsed = JSON.parse(saved);
} catch {
return filters;
}
for (const level of Object.keys(filters)) {
if (typeof parsed?.[level] === 'boolean') filters[level] = parsed[level];
}
return filters;
}
export function filterLogLines(lines, filters, query) {
const needle = query.trim().toLowerCase();
return lines.filter((line) => filters[line.level] !== false && (!needle || line.lower.includes(needle)));
@@ -170,7 +187,7 @@ export function initializeRuntimeLogsComponent() {
scrollDebounce: null,
destroyed: false,
colorLogs: localStorage.getItem('coolify-color-logs') === 'true',
logFilters: JSON.parse(localStorage.getItem('coolify-log-filters')) || { error: true, warning: true, debug: true, info: true },
logFilters: readLogFilters(localStorage.getItem('coolify-log-filters')),
searchQuery: '',
appliedQuery: '',
matchCount: 0,
@@ -124,3 +124,23 @@ it('streams only new lines and appends them to the loaded log', function () {
$page->screenshot(filename: 'runtime-logs-virtualized-stream');
});
it('falls back to the default level filters when the saved filters are invalid', function () {
$page = visit('/login')
->fill('email', 'test@example.com')
->fill('password', 'password')
->click('Login')
->assertSee('Dashboard');
$page->script('localStorage.setItem("coolify-log-filters", "{")');
$page->navigate("/server/{$this->stack['server']->uuid}/sentinel/logs")
->assertSee('log line 00001');
// A valid saved preference is still applied.
$page->script('localStorage.setItem("coolify-log-filters", JSON.stringify({ info: false }))');
$page->navigate("/server/{$this->stack['server']->uuid}/sentinel/logs")
->wait(1)
->assertDontSee('log line 00001');
$page->screenshot(filename: 'runtime-logs-invalid-saved-filters');
});