Reputation: 338
All, For some reason i can't see:
logger.LogDebug("Test debug")
At the console logger.
Program:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Logging.ClearProviders();
builder.Logging.AddProvider(new CustomLoggerProvider());
builder.Logging.SetMinimumLevel(LogLevel.Debug);
builder.Services.AddHttpContextAccessor();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.MapGet("/weatherforecast", (ILogger<Program> logger ) =>
{
logger.LogDebug("Test debug");
})
.WithName("GetWeatherForecast")
.WithOpenApi();
app.Run();
CustomLoggerProvider:
public class CustomLoggerProvider : ILoggerProvider
{
public CustomLoggerProvider()
{
}
public ILogger CreateLogger(string categoryName)
{
return new CustomLogger();
}
public void Dispose()
{
Serilog.Log.CloseAndFlush();
}
}
CustomLogger:
public class CustomLogger : Microsoft.Extensions.Logging.ILogger
{
public CustomLogger()
{
Serilog.Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Debug)
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateLogger();
}
public IDisposable? BeginScope<TState>(TState state) where TState : notnull
{
return default;
}
public bool IsEnabled(LogLevel logLevel)
{
return true;
}
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
{
if (!IsEnabled(logLevel))
return;
Serilog.Log.Write((Serilog.Events.LogEventLevel)logLevel, exception, formatter(state, exception));
}
}
Even here it's debug level:
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"Microsoft.AspNetCore": "Debug"
}
},
"AllowedHosts": "*"
}
With all this code above, I still can't see the debug.
I know that i can use Serilog differently, But i need to create a wrapper for the serilog! So i don't want it to be in the AppSettings
The way it does works:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo
.Console()
.WriteTo
.File(
formatter: new Serilog.Formatting.Json.JsonFormatter(),
path: "Logs\\.log",
restrictedToMinimumLevel: LogEventLevel.Debug,
rollOnFileSizeLimit: true,
rollingInterval: RollingInterval.Day
)
.CreateLogger();
builder.Host.UseSerilog();
builder.Services.AddHttpContextAccessor();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.MapGet("/weatherforecast", (ILogger<Program> logger ) =>
{
logger.LogDebug("Test debug");
})
.WithName("GetWeatherForecast")
.WithOpenApi();
app.Run();
How can i see the debug log with the CustomLoggerProvider?
Thanks a lot.
Upvotes: 0
Views: 265
Reputation: 338
Ok so after a research, This is the solution:
builder.Services.AddLogging(x =>
{
x.Services.AddSingleton<ILoggerProvider,CustomLoggerProvider>();
x.SetMinimumLevel(LogLevel.Debug);
x.AddConsole();
x.AddFilter<ConsoleLoggerProvider>(null, LogLevel.Debug);
});
or even better, this code is working prefect:
builder.Services.AddLogging(x =>
{
x.Services.AddSingleton<ILoggerProvider,CustomLoggerProvider>();
// You can take it from your custom settings.
x.AddFilter(null, LogLevel.Debug);
});
Upvotes: 0