¿Cómo escribo registros desde Startup.cs?
Para depurar una aplicación .NET Core que falla al inicio, me gustaría escribir registros desde el archivo startup.cs. Tengo una configuración de registro dentro del archivo que se puede usar en el resto de la aplicación fuera del archivo startup.cs, pero no estoy seguro de cómo escribir registros desde el archivo startup.cs.
ASP.NET Core 6+ (sin inicio)
Con el nuevo enfoque con ASP.NET Core, al no utilizar una Startup
clase explícita, las explicaciones siguientes con ConfigureServices
y Configure
ya no se aplican. En cambio, todo se configura directamente en el creador de aplicaciones web o en la aplicación creada.
Para acceder al registrador en la aplicación, simplemente puede recuperarlo del proveedor de servicios:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
// … adding services to the container
// build the application
var app = builder.Build();
// retrieve the logger
var logger = app.Services.GetService<ILogger<Program>>();
// configure request pipeline
if (!app.Environment.IsDevelopment())
{
logger.LogInformation("Using production pipeline");
app.UseExceptionHandler("/Error");
}
// …
app.MapDefaultControllerRoute();
app.Run();
Sin embargo, como antes, no puede acceder al registrador antes de crear el contenedor de servicios ( builder.Build()
), por las mismas razones que se explican a continuación.
ASP.NET Core 3.1+ (con inicio)
Desafortunadamente, para ASP.NET Core 3.0, la situación vuelve a ser un poco diferente. Las plantillas predeterminadas utilizan HostBuilder
(en lugar de WebHostBuilder
) que configura un nuevo host genérico que puede alojar varias aplicaciones diferentes, sin limitarse a aplicaciones web. Parte de este nuevo host es también la eliminación del segundo contenedor de inyección de dependencia que existía anteriormente para el servidor web. En última instancia, esto significa que no podrá inyectar ninguna dependencia aparte de en IConfiguration
la Startup
clase. Por lo tanto, no podrá iniciar sesión durante el ConfigureServices
método. Sin embargo, puedes inyectar el registrador en el Configure
método e iniciar sesión allí:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILogger<Startup> logger)
{
logger.LogInformation("Configure called");
// …
}
Si es absolutamente necesario iniciar sesión en ConfigureServices
, puede continuar usando el WebHostBuilder
que creará el legado WebHost
que puede inyectar el registrador en la Startup
clase. Tenga en cuenta que es probable que el servidor web se elimine en algún momento en el futuro. Por lo tanto, debería intentar encontrar una solución que funcione para usted sin tener que iniciar sesión ConfigureServices
.
ASP.NET Núcleo 2
Esto ha cambiado significativamente con el lanzamiento de ASP.NET Core 2.0. En ASP.NET Core 2.x, el registro se crea en el generador de host. Esto significa que el registro está disponible a través de DI de forma predeterminada y se puede inyectar en la Startup
clase:
public class Startup
{
private readonly ILogger<Startup> _logger;
public IConfiguration Configuration { get; }
public Startup(ILogger<Startup> logger, IConfiguration configuration)
{
_logger = logger;
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
_logger.LogInformation("ConfigureServices called");
// …
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
_logger.LogInformation("Configure called");
// …
}
}
Opción 1: utilizar directamente el registro (por ejemplo, Serilog) en el inicio.
public class Startup
{
public Startup(IHostingEnvironment env)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.RollingFile(Path.Combine(env.ContentRootPath, "Serilog-{Date}.txt"))
.CreateLogger();
Log.Information("Inside Startup ctor");
....
}
public void ConfigureServices(IServiceCollection services)
{
Log.Information("ConfigureServices");
....
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
Log.Information("Configure");
....
}
Producción:
Para configurar Serilog en la aplicación asp.net-core, consulte el paquete Serilog.AspNetCore en GitHub .
Opción 2: configurar el inicio de sesión en program.cs de esta manera:
var host = new WebHostBuilder()
.UseKestrel()
.ConfigureServices(s => {
s.AddSingleton<IFormatter, LowercaseFormatter>();
})
.ConfigureLogging(f => f.AddConsole(LogLevel.Debug))
.UseStartup<Startup>()
.Build();
host.Run();
Usuario loggerFactory en inicio como este-
public class Startup
{
ILogger _logger;
IFormatter _formatter;
public Startup(ILoggerFactory loggerFactory, IFormatter formatter)
{
_logger = loggerFactory.CreateLogger<Startup>();
_formatter = formatter;
}
public void ConfigureServices(IServiceCollection services)
{
_logger.LogDebug($"Total Services Initially: {services.Count}");
// register services
//services.AddSingleton<IFoo, Foo>();
}
public void Configure(IApplicationBuilder app, IFormatter formatter)
{
// note: can request IFormatter here as well as via constructor
_logger.LogDebug("Configure() started...");
app.Run(async (context) => await context.Response.WriteAsync(_formatter.Format("Hi!")));
_logger.LogDebug("Configure() complete.");
}
}
Detalles completos disponibles en este enlace