Logging im Überblick
Meldungen aus dem Browser landen im selben Serilog-Strom wie die Meldungen des Servers — dafür greifen drei Bausteine ineinander.
Der Weg einer Meldung
- Im Browser ruft jemand
window.log.warn("…")auf, oder es entsteht ein unbehandelter Fehler. - Das Client-Modul fmh-web-log (Paket Basis) sammelt die Ereignisse, formatiert sie als CLEF (Compact Log Event Format) und schickt sie gebündelt als
POST /siwflog. - Die Middleware aus FMH.Komponente.Serilog.Ingestion nimmt sie entgegen, verwandelt jede Zeile zurück in ein Serilog-
LogEventund schreibt es in den Logger der Anwendung. - Ab hier ist es ein ganz normales Server-Ereignis und geht denselben Weg wie jede andere Meldung — in dieser Anwendung nach Seq.
Der Endpunkt /siwflog ist damit die einzige Nahtstelle zwischen Browser und Server. Server und Client müssen sich nur über diese Adresse und über CLEF einig sein.
Welches Paket wofür
| Paket | Läuft | Zweck | Wer es braucht |
|---|---|---|---|
FMH.Komponenten.Basis |
Browser | liefert das JavaScript-Modul fmh-web-log aus |
jede MVC-Anwendung mit FMH-Layout — ohne Zutun |
FMH.Komponente.Serilog.Ingestion |
Server | stellt den Endpunkt /siwflog bereit |
jede Anwendung, die Browser-Meldungen entgegennehmen soll |
FMH.Komponente.Serilog.Sinks.Blazor.WASM |
Browser (WASM) | Serilog-Sink, der aus Blazor WASM heraus an /siwflog sendet |
nur Blazor-WASM-Oberflächen |
Wichtig: FMH.Komponenten.Basis referenziert kein Serilog. fmh-web-log ist reines JavaScript und kennt nur den HTTP-Endpunkt. Serilog kommt ausschliesslich auf der Serverseite und — bei Blazor WASM — im WASM-Sink ins Spiel.
Browser-Logging oder WASM-Sink?
Beide erledigen dieselbe Aufgabe und schliessen einander aus:
- MVC/Razor-Oberfläche →
fmh-web-log. Es ist über das Layout bereits eingebunden, es gibt nichts zu konfigurieren. - Blazor-WASM-Oberfläche →
WriteTo.BrowserHttp(...). Dort gibt es kein FMH-Layout, dafür eine eigene Serilog-Pipeline im Browser.
Die Serverseite ist in beiden Fällen dieselbe.
Zwei Zeilen, dann läuft es
Auf der Serverseite sind es genau zwei Aufrufe:
builder.Host.UseSerilog((context, services, config) => config
.ReadFrom.Configuration(configuration));
var app = builder.Build();
app.UseSiwfLogIngestion();
Der erste macht Serilog zur Logging-Pipeline der Anwendung, der zweite öffnet den Endpunkt für den Browser. Fehlt der zweite, protokolliert der Server weiter — aber alles aus dem Browser geht verloren.
Die vollständige Konfiguration steht unter Server einrichten.