Actualicé mi proyecto a .NET Core 2.2.x y recibí una advertencia obsoleta con respecto al siguiente código, ambas líneas:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); La sugerencia para corregir es The recommended alternative is AddConsole(this ILoggingBuilder builder) . Pensé que eso es lo que estoy usando.
¿Que me estoy perdiendo aqui?
La recomendación de la documentación para usar AddConsole(this ILoggingBuilder builder) es correcta, pero para que funcione, debe agregar una referencia al paquete NuGet Microsoft.Extensions.Logging.Console .
Tuve el mismo problema hoy.
Elimine su configuración de registro de Startup.cs y vaya a su archivo Program.cs y agregue algo como:
var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .ConfigureLogging((hostingContext, logging) => { logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); logging.AddConsole(); logging.AddDebug(); }) .Build();Esto usó el 'constructor' porque la variable 'registro' es un IloggingBuilder (mientras que su código todavía usa ILoggerFactory)
ACTUALIZAR: El otro método que acabo de probar es permanecer dentro de Startup.cs pero mover las cosas de registro del método 'Configurar' a 'Configurar Servicios' de esta manera:
public void ConfigureServices(IServiceCollection services) { services.AddLogging(loggingBuilder => { loggingBuilder.AddConfiguration(Configuration.GetSection("Logging")); loggingBuilder.AddConsole(); loggingBuilder.AddDebug(); }); }Quizás mantiene Program.cs menos contaminado...
No te preocupes por eso, ¡esto es lo más tonto del mundo!
Nota
El siguiente ejemplo de código usa un constructor ConsoleLoggerProvider que quedó obsoleto en la versión 2.2. Los reemplazos adecuados para las API de registro obsoletas estarán disponibles en la versión 3.0. Mientras tanto, es seguro ignorar y suprimir las advertencias.
En caso de que pensaras que olvidaste lo que significa Obsoleto , ¡no lo habías hecho! No se preocupe por eso y simplemente ignórelo por ahora, o suprima la advertencia (lo siento, no tengo el código a mano).
(Ojalá pusieran una mejor explicación de por qué se hizo esto, a eso me refiero con tonto).
De acuerdo con el problema abierto en GitHub para esto, los métodos de reemplazo ya se están llamando si usa el método CreateDefaultBuilder() en su Program.cs.
https://github.com/aspnet/Docs/issues/9829
El único problema que tengo es que solo los encendí para entornos que no son de producción... y no veo una manera de hacerlo en el futuro.
Recibí la misma advertencia cuando estaba actualizando el código de registro de .Net Core 2.1 a 3.0. La forma recomendada de realizar la actualización está documentada en MSDN .
En mi caso, estaba tratando de obtener una instancia de LoggerFactory para consola, que es bastante sencilla en .Net Core 3.0:
using (var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole())) { // use loggerFactory }Si no tiene acceso a LoggerFactory.Create() , todavía puede usar ILoggerFactory con el método AddProvider() dándole un ConsoleLoggerProvider() pero es un poco molesto si quiere hacer algo simple. El problema es que ConsoleLoggerProvider() requiere un IOptionsMonitor < ConsoleLoggerOptions > como parámetro y es lo más fácil de hacer si
IOptionsMonitor<> , oes crear una clase ficticia:
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Console; using Microsoft.Extensions.Options; class DummyConsoleLoggerOptionsMonitor : IOptionsMonitor<ConsoleLoggerOptions> { private readonly ConsoleLoggerOptions option = new ConsoleLoggerOptions(); public DummyConsoleLoggerOptionsMonitor(LogLevel level) { option.LogToStandardErrorThreshold = level; } public ConsoleLoggerOptions Get(string name) { return this.option; } public IDisposable OnChange(Action<ConsoleLoggerOptions, string> listener) { return new DummyDisposable(); } public ConsoleLoggerOptions CurrentValue => this.option; private sealed class DummyDisposable : IDisposable { public void Dispose() { } } } Luego puede usar su ILoggerFactory como:
factory.AddProvider( new ConsoleLoggerProvider( new DummyConsoleLoggerOptionsMonitor(LogLevel.Debug)));