We use the Serilog bootstrap logger found in the NuGet package Serilog.AspNetCore. This allows us to see messages while debugging locally. It later allows us to renew the Logger. You can read more about bootstrap logger on Nicholas Blumhardt's blog. We also setup Serilog in the appsettings.json. You should be able to pull out Microsoft.Extensions.Logging from your packages. Hopefully you can use our configuration to help you.
NuGet Packages used:
- Serilog.AspNetCore
- Serilog.Enrichers.Environment
- Serilog.Enrichers.Thread
- Serilog.Sinks.Console
- Serilog.Sinks.MSSqlServer
- Serilog.Sinks.PeriodicBatching
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Warning)
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateBootstrapLogger(); //https://nblumhardt.com/2020/10/bootstrap-logger/
try
{
Log.Debug("Starting web application.");
var builder = WebApplication.CreateBuilder(args);
IConfigurationRoot configuration;
var configurationBuilder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
configuration = configurationBuilder.Build();
var env = configuration.GetValue(typeof(string), "environmentVariables:ASPNETCORE_ENVIRONMENT")!.ToString();
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
Args = args,
EnvironmentName = env,
});
builder.Host.UseSerilog((context, services, configuration) => configuration
.ReadFrom.Configuration(context.Configuration)
.ReadFrom.Services(services)
.Enrich.FromLogContext()
);
var app = builder.Build();
/* Setup App i.e. app.UseAuthentication(); */
app.UseSerilogRequestLogging(options =>
{
// Customize the message template
options.MessageTemplate = "{RequestPath} responded {StatusCode} in {Elapsed}";
// Emit debug-level events instead of the defaults
options.GetLevel = (httpContext, elapsed, ex) => LogEventLevel.Debug;
// Attach additional properties to the request completion event
options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
{
diagnosticContext.Set("RequestHost", httpContext.Request.Host.Value);
diagnosticContext.Set("RequestScheme", httpContext.Request.Scheme);
//diagnosticContext.Set("StatusCode", httpContext.Response.StatusCode);
};
});
app.Run();
{
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.MSSqlServer" ],
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft.AspNetCore": "Warning",
"Microsoft": "Warning"
}
},
"WriteTo": [
{ "Name": "Console" },
{
"Name": "MSSqlServer",
"Args": {
"connectionString": "*****",
"sinkOptionsSection": {
"tableName": "logTableName",
"schemaName": "user",
"autoCreateSqlTable": false,
"batchPostingLimit": 1000,
"period": "0.00:00:30"
},
"restrictedToMinimumLevel": "Debug",
"columnOptionsSection": {
"disableTriggers": true,
"clusteredColumnstoreIndex": false,
"primaryKeyColumnName": "Id",
"addStandardColumns": [ "LogEvent" ],
"additionalColumns": [
{
"ColumnName": "EnvironmentUserName",
"DataType": "nvarchar",
"DataLength": 120,
"AllowNull": true
},
{
"ColumnName": "MachineName",
"DataType": "nvarchar",
"DataLength": 120,
"AllowNull": true
},
{
"ColumnName": "ProcessId",
"DataType": "int",
"AllowNull": true
},
{
"ColumnName": "ThreadId",
"DataType": "int",
"AllowNull": true
},
{
"ColumnName": "BatchId",
"DataType": "nvarchar",
"DataLength": 120,
"AllowNull": true
},
{
"ColumnName": "ApplicationName",
"DataType": "nvarchar",
"DataLength": 120,
"AllowNull": true
},
{
"ColumnName": "CorrelationId",
"PropertyName": "ConnectionId",
"DataType": "nvarchar",
"DataLength": 120,
"AllowNull": true
}
],
"id": {
"columnName": "Id",
"nonClusteredIndex": true
},
"message": { "columnName": "Message" },
"messageTemplate": { "columnName": "MessageTemplate" },
"level": {
"columnName": "Level",
"storeAsEnum": false
},
"timeStamp": {
"columnName": "TimeStamp",
"convertToUtc": true
},
"exception": { "columnName": "Exception" },
"properties": {
"columnName": "Properties",
"excludeAdditionalProperties": true,
"dictionaryElementName": "dict",
"itemElementName": "item",
"omitDictionaryContainerElement": false,
"omitSequenceContainerElement": false,
"omitStructureContainerElement": false,
"omitElementIfEmpty": true,
"propertyElementName": "prop",
"rootElementName": "root",
"sequenceElementName": "seq",
"structureElementName": "struct",
"usePropertyKeyAsElementName": false
},
"logEvent": {
"columnName": "LogEvent",
"excludeAdditionalProperties": true,
"excludeStandardColumns": true
}
}
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId", "WithEnvironmentUserName" ],
"Properties": {
"ApplicationName": "My Cool Website"
}
},
"AllowedHosts": "*"
}