/serilog-sinks-browserhttp

Serilog sink for client-side Blazor, with matching ASP.NET Core server relay

Primary LanguageC#Apache License 2.0Apache-2.0

Serilog.Sinks.BrowserHttp Build status

Note: this project is currently at the proof-of-concept stage, and may eat your laundry.

A Serilog sink for client-side Blazor that posts batched events using the browser's HTTP stack. These can be sent to any remote HTTP endpoint, including the app's origin server. A companion package, Serilog.AspNetCore.Ingestion, is also published from this repository, and can be used to relay events from the client to Serilog running in the ASP.NET Core server process.

Getting started

In a Blazor client (WASM) app, first install Serilog.Sinks.BrowserHttp:

dotnet add package Serilog.Sinks.BrowserHttp

The sink is enabled using WriteTo.BrowserHttp:

var builder = WebAssemblyHostBuilder.CreateDefault(args);
Log.Logger = new LoggerConfiguration()
    .MinimumLevel.ControlledBy(levelSwitch)
    .WriteTo.BrowserConsole()
    .WriteTo.BrowserHttp($"{builder.HostEnvironment.BaseAddress}ingest")
    .CreateLogger();

Log.Information("Hello, browser!");

Events will be POSTed in newline-delimited JSON batches to the given URL. See Serilog.Formatting.Compact for a description of the JSON schema that is used.

Server-side relay for ASP.NET Core

To use the server-side relay in an ASP.NET Core app that uses Serilog, install Serilog.AspNetCore.Ingestion:

dotnet add package Serilog.AspNetCore.Ingestion

Then, add UseSerilogIngestion() to the app builder in Startup.cs:

app.UseSerilogIngestion();

The client app should be configured with LoggingLevelSwitch so that the server can control the client's logging level. An endpoint address is not required. For example:

// In a Blazor WASM Program.cs file
var builder = WebAssemblyHostBuilder.CreateDefault(args);
var levelSwitch = new LoggingLevelSwitch();
Log.Logger = new LoggerConfiguration()
    .MinimumLevel.ControlledBy(levelSwitch)
    .WriteTo.BrowserHttp($"{builder.HostEnvironment.BaseAddress}ingest", controlLevelSwitch: levelSwitch)
    .CreateLogger();

Log.Information("Hello, browser!");

See the /samples directory in this repository for a working end-to-end example.