¿Cómo escribo registros desde Startup.cs?

Resuelto Mark Redman asked hace 7 años • 15 respuestas

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.

Mark Redman avatar Dec 22 '16 23:12 Mark Redman
Aceptado

ASP.NET Core 6+ (sin inicio)

Con el nuevo enfoque con ASP.NET Core, al no utilizar una Startupclase explícita, las explicaciones siguientes con ConfigureServicesy Configureya 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 IConfigurationla Startupclase. Por lo tanto, no podrá iniciar sesión durante el ConfigureServicesmétodo. Sin embargo, puedes inyectar el registrador en el Configuremé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 WebHostBuilderque creará el legado WebHostque puede inyectar el registrador en la Startupclase. 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 Startupclase:

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");

        // …
    }
}
poke avatar Sep 19 '2017 10:09 poke

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:

serilogo

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

Sanket avatar Dec 22 '2016 17:12 Sanket