Я обновил свой проект до .NET Core 2.2.x и получил устаревшее предупреждение относительно следующего кода - обе строки:
public void Configure(IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
Предложение исправить - The recommended alternative is AddConsole(this ILoggingBuilder builder). Я думал, что это то, что я использую.
Что мне здесь не хватает?
Ведение журнала настроено на WebHost (и, кажется, с 2.0). См. документы. Если вы используете WebHost.CreateDefaultBuilder, вы бесплатно получаете логирование консоли.





Сегодня у меня была такая же проблема.
Удалите конфигурацию ведения журнала из Startup.cs, перейдите в файл Program.cs и добавьте что-то вроде:
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();
Здесь использовался «строитель», потому что переменная «ведение журнала» - это IloggingBuilder (в то время как ваш код все еще использует ILoggerFactory)
ОБНОВЛЕНИЕ. Другой метод, который я только что попробовал, - остаться внутри Startup.cs, но переместить данные журналов из метода Configure в ConfigureServices следующим образом:
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging(loggingBuilder =>
{
loggingBuilder.AddConfiguration(Configuration.GetSection("Logging"));
loggingBuilder.AddConsole();
loggingBuilder.AddDebug();
});
}
Возможно, сохраняет Program.cs менее загрязненным ...
Это вообще обязательно (я имею ввиду AddLogging) ?? Я только что создал новый проект веб-API, ничего из этого не делал. Я просто ввожу ILogger<MyClass> logger через параметр и могу войти без проблем (очевидно, в консоли). Вот и мне интересно ... почему именно AddConsole?
Как вы используете метод ConfigureServices, когда пытаетесь настроить ведение журнала библиотеки классов из реальной программы?
Рекомендация документации по использованию AddConsole(this ILoggingBuilder builder) верна, но для этого вам нужно добавить ссылку на пакет NuGet Microsoft.Extensions.Logging.Console.
Согласно проблеме, открытой для этого на GitHub, методы замены уже вызываются, если вы используете метод CreateDefaultBuilder () в своем Program.cs.
https://github.com/aspnet/Docs/issues/9829
Единственная проблема, с которой я столкнулся, это то, что я включил их только для непроизводственных сред ... и не вижу способа сделать это в будущем.
Не беспокойтесь об этом - это самая тупая вещь на свете!
Note
The following code sample uses a ConsoleLoggerProvider constructor that has been obsoleted in version 2.2. Proper replacements for obsolete logging APIs will be available in version 3.0. In the meantime, it is safe to ignore and suppress the warnings.
Если вы думали, что забыли, что означает Устаревший - вы не забыли! Не беспокойтесь об этом и просто проигнорируйте его пока - или подавите предупреждение (извините, у меня нет кода для этого под рукой).
(Хотелось бы, чтобы они дали лучшее объяснение, почему это было сделано - вот что я имею в виду под тупым.)
Не уверен, что новый ответ на этот вопрос, так как 3.0 сейчас отсутствует - поэтому, если вы используете 3.0, сам этот ответ теперь устарел ;-)
Я получил такое же предупреждение, когда обновлял код ведения журнала с .Net Core 2.1 до 3.0. Рекомендуемый способ выполнить обновление - задокументировано в MSDN.
В моем случае я пытался получить экземпляр LoggerFactory для консоли, что довольно просто в .Net Core 3.0:
using (var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole()))
{
// use loggerFactory
}
Лучший ответ, поскольку он не ограничен инфраструктурой DI ASP.NET Core. Принятый оставляет полную структуру за рамками.
Точно. Мне пришлось обновить nuget расширения журналирования для другого разрешения зависимости, и внезапно он ломается, и я думаю: «Куда вы его переместили на этот раз». Это дает лаконичный ответ.
он не работает в .NET 5. Где нет метода AddConsole в ILoggerFactory.
Если у вас нет доступа к LoggerFactory.Create(), вы все равно можете использовать ILoggerFactory с методом AddProvider (), присвоив ему ConsoleLoggerProvider (), но это немного неудобно, если вы хотите сделать что-то простое. Проблема в том, что ConsoleLoggerProvider() требует IOptionsMonitor <ConsoleLoggerOptions> в качестве параметра, и это проще всего сделать, если вы
IOptionsMonitor<>, илизаключается в создании фиктивного класса:
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()
{
}
}
}
Затем вы можете использовать свой ILoggerFactory как:
factory.AddProvider(
new ConsoleLoggerProvider(
new DummyConsoleLoggerOptionsMonitor(LogLevel.Debug)));
LoggerFactory, конечно же, неLoggingBuilder, не так ли?