使用依赖注入 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
}
与 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
}