F8: formatJSONLogs plain-text fallback — both arms of `withTimestamps ? rawText
: text` yield rawText (text === rawText when !withTimestamps), so use rawText.
F9: controllerLogsController comment referenced the old 'Live logs' label removed
by F7 — update it to 'Auto-refresh logs'.
F10: stripHeadersFunc has no external importers — drop the speculative export.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Foundation for append-only log rendering and HTTP log streaming.
- FormattedLine gains a stable, monotonically increasing `id` (new
lineId.ts sequence), assigned centrally in formatLogs. Internal
formatters now return id-less FormattedLineContent. This lets the
viewer use `track by log.id` so already-rendered rows are never
re-bound (fixes the text-selection collapse).
- formatJSONLine: runtime guard so a bare JSON string/array log line
falls back to plain text instead of rendering Object.keys as
`0=h 1=e ...`.
- createLogStreamProcessor: stateful demuxer that buffers streamed text,
emits only complete lines (carrying the partial remainder), and reuses
formatLogs/stripHeadersFunc for Docker 8-byte frame demux.
- Unit tests for the demuxer, stable-id assignment and the JSON guard.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(app/logs): change pattern to detect double serialized JSON logs
* fix(app/logs): fallback to raw display when parsing fails + include timestamp for Zerolog logs
* fix(logging): default to pretty logging EE-4371
* feat(app/logs): prettify stack traces in JSON logs
* feat(nomad/logs): prettify JSON logs in log viewer
* feat(kubernetes/logs): prettigy JSON logs in log viewers
* feat(app/logs): format and color zerolog prettified logs
* fix(app/logs): pre-parse logs when they are double serialized
Co-authored-by: andres-portainer <andres-portainer@users.noreply.github.com>
Co-authored-by: LP B <xAt0mZ@users.noreply.github.com>