Supervisor S-0c: Log Viewer im Terminal (JSONL menschenlesbar, CID-Forensik)

Terminal-Fenster jetzt mit TabControl (via Designer): Tab 'Live' = bisherige Anzeige,
Tab 'Log Viewer' = JSONL-Tagesdateien menschenlesbar aufbereitet:
- Filter: Datum (DateTimePicker), Level, CorrelationId (SignalId), Suchtext.
- Doppelklick auf eine CID laedt die komplette Signal-Kette ('zeig mir alles zu diesem Signal').
- LogJson.ParseLine (pur, Gegenstueck zu Format): tolerant gegen kaputte Zeilen (null statt Crash);
  Viewer ueberspringt sie. UI-Schutz bei sehr grossen Tagen (20k-Limit).

Tests: +5 (Parse-Roundtrip, kaputte Zeilen). Build 0 Fehler, 341 Tests gruen, --smoke-ui komplett gruen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-07-16 18:52:15 +02:00
co-authored by Claude Opus 4.8
parent bf3e012f8b
commit ca00977ea3
4 changed files with 369 additions and 7 deletions
@@ -47,6 +47,32 @@ namespace PolyTraderSharp.Services
DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull
});
}
/// <summary>Geparste JSONL-Zeile für den Log Viewer.</summary>
public sealed record ParsedLogLine(string Time, string Level, string Cid, string Message);
/// <summary>
/// Parst eine JSONL-Zeile (Gegenstück zu <see cref="Format"/>). Liefert null bei leeren/
/// beschädigten Zeilen (der Viewer überspringt sie, statt zu brechen).
/// </summary>
public static ParsedLogLine? ParseLine(string line)
{
if (string.IsNullOrWhiteSpace(line)) return null;
try
{
using var doc = System.Text.Json.JsonDocument.Parse(line);
var root = doc.RootElement;
string ts = root.TryGetProperty("ts", out var t) ? t.GetString() ?? "" : "";
string level = root.TryGetProperty("level", out var l) ? l.GetString() ?? "" : "";
string cid = root.TryGetProperty("cid", out var c) ? c.GetString() ?? "" : "";
string msg = root.TryGetProperty("msg", out var m) ? m.GetString() ?? "" : "";
return new ParsedLogLine(ts, level, cid, msg);
}
catch (System.Text.Json.JsonException)
{
return null;
}
}
}
public class TerminalLogger