使用依赖注入 C# 分离派生和基础 类 之间的日志记录

Separation of Logging between derived and base classes with Dependency Injection C#

与 SO (Dependency injection in base and derived classes) 类似,我希望将基础 class 和派生 class 的日志记录 'category' 分开。我尝试了 SO 中两个答案的变体,但没有得到想要的结果。

正在使用的记录器是:Microsoft.Extensions.Logging

基础class: 迄今为止的最大努力是尝试正确地投射它,但这没有用。

public abstract class LifetimeEventsHostedService : IHostedService
{
  private readonly ILogger<LifetimeEventsHostedService> _logger;
  protected LifetimeEventsHostedService(ILogger logger)
  {
    _logger = (ILogger<LifetimeEventsHostedService>)logger;
  }
  public virtual Task StartAsync(CancellationToken cancellationToken)
  {
    _logger.LogInformation("LifetimeEventsHostedService.StartAsync has been called");
  }  
}

派生class:

public class DerivedHostedService: LifetimeEventsHostedService
{
  private readonly ILogger<DerivedHostedService> _logger;

  public DerivedHostedService(ILogger<DerivedHostedService> logger) : base(logger) 
  {
    _logger = logger;
  }

  public override async Task StartAsync(CancellationToken cancellationToken)
  {
    await base.StartAsync(cancellationToken);
    _logger.LogInformation("StartAsync completed");
  }
}

现在控制台日志显示如下:

info: PlayerService.Services.HostedServices.DerivedHostedService[0] // Should show as base class category
      LifetimeEventsHostedService.StartAsync has been called        // Hacky workaround to include base category in the message
info: PlayerService.Services.HostedServices.DerivedHostedService[0] // Obviously (correctly) showing correct in derived class
      StartAsync completed
info: PlayerService.Services.HostedServices.DerivedHostedService[0] // Should show as base class category
      LifetimeEventsHostedService.OnStarted has been called         // Hacky workaround to include base category in the message
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.

我在上面完成它的方法有效,但我想找到一种方法将 type(类别)设置为基础 class,将基础 class 分开来自派生 class 并在基础 class 中省略 hacky(额外的细节/基础 class 名称),而是尽可能保持两者之间的日志记录分离。

您可以在派生的 class:

中请求两个记录器
public DerivedHostedService(
    ILogger<DerivedHostedService> logger, 
    ILogger<LifetimeEventsHostedService> baseLogger) : base(baseLogger)
{}

如果您最终需要在您的基础 class 中提供多项服务,但不希望每个派生 class 都必须调用它们,那么这是另一种选择。我个人会避免它,但它可能会绕过你收到的警告,尽管我个人认为你有“非常具体的原因将两者分开”。

   public DerivedHostedService(
        ILogger<DerivedHostedService> logger, 
        IServiceProvider services) : base(services)
    {}

    public BaseHostedService(
        IServiceProvider services)
    {

      var logger = services.GetRequiredService<ILogger<BaseHostedService>>();

      // etc

    }