Как исправить устаревшие методы ILoggerFactory?

Я обновил свой проект до .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). Я думал, что это то, что я использую.

Что мне здесь не хватает?

LoggerFactory, конечно же, не LoggingBuilder, не так ли?

HimBromBeere 18.12.2018 21:11

Ведение журнала настроено на WebHost (и, кажется, с 2.0). См. документы. Если вы используете WebHost.CreateDefaultBuilder, вы бесплатно получаете логирование консоли.

Kirk Larkin 18.12.2018 21:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
63
2
33 702
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Сегодня у меня была такая же проблема.

Удалите конфигурацию ведения журнала из 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?

Ish Thomas 21.05.2020 00:09

Как вы используете метод ConfigureServices, когда пытаетесь настроить ведение журнала библиотеки классов из реальной программы?

jeancallisti 15.10.2021 15:42

Рекомендация документации по использованию 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, сам этот ответ теперь устарел ;-)

Simon_Weaver 20.11.2019 19:06

Я получил такое же предупреждение, когда обновлял код ведения журнала с .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. Принятый оставляет полную структуру за рамками.

d_f 27.02.2020 19:51

Точно. Мне пришлось обновить nuget расширения журналирования для другого разрешения зависимости, и внезапно он ломается, и я думаю: «Куда вы его переместили на этот раз». Это дает лаконичный ответ.

Ran Sagy 21.05.2020 23:56

он не работает в .NET 5. Где нет метода AddConsole в ILoggerFactory.

Alex78191 18.12.2021 16:49

Если у вас нет доступа к LoggerFactory.Create(), вы все равно можете использовать ILoggerFactory с методом AddProvider (), присвоив ему ConsoleLoggerProvider (), но это немного неудобно, если вы хотите сделать что-то простое. Проблема в том, что ConsoleLoggerProvider() требует IOptionsMonitor <ConsoleLoggerOptions> в качестве параметра, и это проще всего сделать, если вы

  • у вас нет доступа к механизму опций в базе кода (моя проблема), или
  • реальные механизмы опций в вашей существующей кодовой базе не совпадают с IOptionsMonitor<>, или
  • у вас есть другие причины не использовать возможности параметров ASP.Net

заключается в создании фиктивного класса:

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

Другие вопросы по теме