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

  1. Im Browser ruft jemand window.log.warn("…") auf, oder es entsteht ein unbehandelter Fehler.
  2. 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.
  3. Die Middleware aus FMH.Komponente.Serilog.Ingestion nimmt sie entgegen, verwandelt jede Zeile zurück in ein Serilog-LogEvent und schreibt es in den Logger der Anwendung.
  4. 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ächefmh-web-log. Es ist über das Layout bereits eingebunden, es gibt nichts zu konfigurieren.
  • Blazor-WASM-OberflächeWriteTo.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.