Регистратор не отображается в приложении ASP.NET Core 2.1 - PullRequest
0 голосов
/ 21 декабря 2018

Как видно из заголовка, почему мой Logger не отображается в консоли, когда я запускаю приложение с dotnet run

Я использую Logger в классе, отличном от Controller.

Вот код:

public class TestController : Controller
{
    private readonly ITestService service;
    public TestController(ITestService service)
    {
        this.service = service;
    }
}

public class TestService : ITestService
{
    private readonly ILogger logger;
    public TestService(ILogger<TestService> logger)
    {
        this.logger = logger;
    }

    public Task SomeFunction()
    {
        logger.Information("Do some function");
        return Task.CompleteTask;
    }
}

Я использую Microsoft.Extensions.Logging для ILogger

Вот как я регистрирую свой сервис в Startup.cs:

services.Scan(scan => scan
    .FromAssemblyOf<ITestService>()
    .AddClasses(classes => classes
        .Where(t => t.Name.EndsWith("Service")))
    .AsImplementedInterfaces()
    .WithTransientLifetime());

IЯ использую Scrutor для Scan

И вот моя конфигурация для моего Program.cs:

WebHost.CreateDefaultBuilder(args)
    .ConfigureServices(services => services.AddAutofac())
    .ConfigureAppConfiguration((context, builder) =>
    {
        builder.SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{Environment.MachineName}.json", optional: true, reloadOnChange: true);
    })
    .ConfigureLogging((hostingContext, logging) =>
    {
        logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
        logging.AddConsole();
        logging.AddDebug();
    })
    .UseStartup<Startup>();

В качестве кода я попытался вызвать регистратор с logger.Information(""); ирегистратор не отображался в моей консоли.

Что не так с моим кодом?

Извините за мой английский.Заранее спасибо

Редактировать:

Почти забыли, вот мой appsettings.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    },
    "Console": {
      "IncludeScopes": "true"
    }
  },
  "AllowedHosts": "*"
}

1 Ответ

0 голосов
/ 21 декабря 2018

Относительно использования регистрации в любом компоненте:

Вы только что пропустили AddTransient.

Вот полный пример, который работал для меня.

Добавление регистрации в компонент вВаше заявление выполняется путем запроса либо ILoggerFactory, либо ILogger<T> через инъекцию зависимостей.Если запрашивается ILoggerFactory, должен быть создан регистратор, используя его метод CreateLogger.

Если ваш CustomClass является контейнером данных (класс DTO), он не должен знать о ведении журнала,но просто содержат данные.

Для других классов с именами, такими как «Служба», «Поставщик», «Обработчик» и т. д., лучшая практика - разрешать экземпляры с помощью внедрения зависимостей.В общем, вы должны использовать DI везде, где это возможно, так как это метод для достижения слабой связи между объектами и их соавторами или зависимостями.Для получения дополнительной информации может быть интересен следующий вопрос: Должен ли я использовать Dependency Injection или статические фабрики?

Поэтому просто добавьте ILogger<CustomClass> в его конструктор (фактически так же, как вы делаетедля контроллеров), поскольку .NET Core по умолчанию поддерживает только внедрение конструктора:

public class CustomClass
{
    private readonly ILogger _logger;

    public CustomClass(ILogger<CustomClass> logger)
    {
        _logger = logger;
    }
}

Встроенный контейнер внедрения зависимостей ASP.NET Core автоматически разрешает переходные зависимости.Поэтому, если ваш контроллер имеет класс A в качестве зависимости, которая использует класс B, где вы хотите что-то регистрировать, ваш код может выглядеть примерно так:

public class MyController
{
    public MyController(ClassA classA)
    { ... }
}

public class ClassA
{
    public ClassA(ClassB classB)
    { ... }
}

public class ClassB
{
    private readonly ILogger _logger;

    public ClassB(ILogger<ClassB> logger)
    {
        _logger = logger;
    }

    public void DoSomethingWithLogging()
    {
        // use _logger
    }
}

Обратите внимание, что вам также необходимо зарегистрироватьзависимости в Startup с использованием IServiceCollection.Add… методов:

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddTransient<ClassB>();
    services.AddTransient<ClassA>();
}

Встроенная поддержка ведения журнала означает, что .NET Core из коробки знает о встроенных абстракциях и использует их для ведения журнала.Это в основном выполняется с помощью интерфейсов ILoggerFactory и ILoggerProvider.

/// <summary>
/// Represents a type used to configure the logging system and create instances of <see cref="ILogger"/> from
/// the registered <see cref="ILoggerProvider"/>s.
/// </summary>
public interface ILoggerFactory : IDisposable

// <summary>
/// Represents a type that can create instances of <see cref="ILogger"/>.
/// </summary>
public interface ILoggerProvider : IDisposable

Используя собственную реализацию ILoggerProvider, вы можете добавить свой собственный регистратор, который может делать все, что вы захотите.В качестве рабочего примера вы можете проверить реализацию регистратора NLog .

А благодаря ILoggerFactory вы можете просто настроить регистратор для конкретных проектов:

Чтобы настроить ведение журнала в приложении ASP.NET Core, необходимо разрешить ILoggerFactory в методе Configure вашего класса Startup.ASP.NET Core автоматически предоставит экземпляр ILoggerFactory с использованием внедрения зависимостей, когда вы добавите параметр этого типа в метод Configure.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...