LogMaster.NetCore
0.1.5
dotnet add package LogMaster.NetCore --version 0.1.5
NuGet\Install-Package LogMaster.NetCore -Version 0.1.5
<PackageReference Include="LogMaster.NetCore" Version="0.1.5" />
<PackageVersion Include="LogMaster.NetCore" Version="0.1.5" />
<PackageReference Include="LogMaster.NetCore" />
paket add LogMaster.NetCore --version 0.1.5
#r "nuget: LogMaster.NetCore, 0.1.5"
#:package LogMaster.NetCore@0.1.5
#addin nuget:?package=LogMaster.NetCore&version=0.1.5
#tool nuget:?package=LogMaster.NetCore&version=0.1.5
LogMaster
LogMaster is a small ASP.NET Core helper for detailed HTTP request/response logging that can be turned on and off from an admin panel through a database-backed setting.
It ships assemblies for .NET 8, .NET 9, and .NET 10.
It is designed for temporary troubleshooting. Keep detailed body logging disabled by default in production, then enable it for a short time when you need to inspect payloads.
What it gives you
- Global middleware; no logging code inside controllers or services.
- Runtime on/off switch stored in DB.
- Selectable log targets:
ILogger/Serilog, DB table, or both. - Fail-open behavior: a settings-store failure disables detailed logging without interrupting the HTTP request.
- Admin API for reading/updating detailed logging settings.
- Request body, response body, headers, query string, status code, duration, user, trace id.
- Sensitive field masking for headers and JSON bodies.
- Path exclusions such as
/health,/swagger,/metrics. - Max body length limit.
Install
After publishing to NuGet:
dotnet add package LogMaster.NetCore
For local testing before publishing:
dotnet pack .\LogMaster\LogMaster.csproj -c Release
dotnet add package LogMaster.NetCore --source .\artifacts\packages
Use in an ASP.NET Core app
Wire it in Program.cs.
using LogMaster.DependencyInjection;
using Microsoft.Data.SqlClient;
builder.Services.AddLogMaster(options =>
{
options.AdminRoute = "/admin/logging/detailed";
options.SettingsCacheDuration = TimeSpan.FromSeconds(5);
options.FailOpenOnSettingsStoreError = true;
});
builder.Services.AddLogMasterDbSettingsStore(
async (_, cancellationToken) =>
{
var connection = new SqlConnection(
builder.Configuration.GetConnectionString("DefaultConnection"));
await connection.OpenAsync(cancellationToken);
return connection;
});
// Default detailed HTTP logs go to ILogger, so Serilog receives them automatically.
// To write detailed HTTP logs directly to a DB table instead, add:
builder.Services.AddLogMasterDbLogSink(
async (_, cancellationToken) =>
{
var connection = new SqlConnection(
builder.Configuration.GetConnectionString("DefaultConnection"));
await connection.OpenAsync(cancellationToken);
return connection;
});
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
app.UseLogMasterDetailedLogging();
app.MapControllers();
app.MapLogMasterAdminApi();
app.Run();
The default store creates this SQL Server table automatically:
CREATE TABLE [dbo].[LogMasterSettings]
(
[Key] nvarchar(200) NOT NULL PRIMARY KEY,
[Value] nvarchar(max) NOT NULL,
[UpdatedAtUtc] datetime2(7) NOT NULL
);
Log targets
By default, detailed HTTP logs are written through ILogger.
That means if your app uses Serilog, LogMaster logs flow to your existing Serilog sinks automatically:
builder.Services.AddLogMaster();
Use a DB table instead of ILogger:
builder.Services.AddLogMaster();
builder.Services.AddLogMasterDbLogSink(
async (_, cancellationToken) =>
{
var connection = new SqlConnection(
builder.Configuration.GetConnectionString("DefaultConnection"));
await connection.OpenAsync(cancellationToken);
return connection;
});
Use both DB and ILogger/Serilog:
builder.Services.AddLogMaster();
builder.Services.AddLogMasterDbLogSink(
async (_, cancellationToken) =>
{
var connection = new SqlConnection(
builder.Configuration.GetConnectionString("DefaultConnection"));
await connection.OpenAsync(cancellationToken);
return connection;
},
includeLoggerSink: true);
The DB log sink creates this SQL Server table automatically:
CREATE TABLE [dbo].[LogMasterHttpLogs]
(
[Id] bigint IDENTITY(1,1) NOT NULL PRIMARY KEY,
[TimestampUtc] datetime2(7) NOT NULL,
[TraceId] nvarchar(100) NOT NULL,
[Method] nvarchar(20) NOT NULL,
[Path] nvarchar(2048) NOT NULL,
[QueryString] nvarchar(max) NULL,
[StatusCode] int NOT NULL,
[ElapsedMs] float NOT NULL,
[UserName] nvarchar(256) NULL,
[RemoteIpAddress] nvarchar(100) NULL,
[RequestHeaders] nvarchar(max) NULL,
[ResponseHeaders] nvarchar(max) NULL,
[RequestBody] nvarchar(max) NULL,
[ResponseBody] nvarchar(max) NULL,
[ExceptionType] nvarchar(512) NULL,
[ExceptionMessage] nvarchar(max) NULL
);
Admin API
Get current settings:
GET /admin/logging/detailed
Update all settings:
PUT /admin/logging/detailed
Content-Type: application/json
{
"enabled": true,
"logRequestBody": true,
"logResponseBody": true,
"logHeaders": true,
"logQueryString": true,
"logOnlyErrors": false,
"maxBodyLength": 10000,
"excludedPaths": ["/health", "/swagger", "/metrics"],
"sensitiveFields": ["authorization", "cookie", "password", "token"]
}
Only toggle enabled/disabled:
POST /admin/logging/detailed/enabled
Content-Type: application/json
{
"enabled": false
}
Read detailed HTTP logs from the DB log table:
GET /admin/logging/detailed/logs?take=50&skip=0
Optional filters:
GET /admin/logging/detailed/logs?take=25&path=/orders&statusCode=500
GET /admin/logging/detailed/logs?traceId=0HNM7TNI5DO96:00000002
GET /admin/logging/detailed/logs?fromUtc=2026-06-12T00:00:00Z&toUtc=2026-06-12T23:59:59Z
This endpoint requires AddLogMasterDbLogSink(...), because it reads from the [dbo].[LogMasterHttpLogs] table.
Admin panel usage
Your admin panel can call:
GET /admin/logging/detailedto load the current form state.POST /admin/logging/detailed/enabledfor a simple switch.PUT /admin/logging/detailedwhen editing detailed options.
LogMaster does not enforce authorization for admin endpoints. The host application can apply its own policy when mapping them:
app.MapLogMasterAdminApi().RequireAuthorization("AdminOnly");
If the database-backed settings store cannot be reached, LogMaster uses DefaultSettings for the configured cache duration and continues the HTTP request. This is enabled by default through FailOpenOnSettingsStoreError. Set it to false only when a settings-store error should fail the request.
Create and publish the NuGet package
Create the package:
dotnet pack .\LogMaster\LogMaster.csproj -c Release
The .nupkg file is written to:
artifacts/packages
Publish to nuget.org:
dotnet nuget push .\artifacts\packages\LogMaster.NetCore.0.1.5.nupkg --api-key YOUR_NUGET_API_KEY --source https://api.nuget.org/v3/index.json
Before publishing publicly, check that LogMaster.NetCore is available on nuget.org. If it is already taken, change <PackageId> in LogMaster/LogMaster.csproj.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- No dependencies.
-
net8.0
- No dependencies.
-
net9.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.