【问题标题】:How to dispose ILogger Scope created by Dependency Injection如何处理依赖注入创建的 ILogger Scope
【发布时间】:2019-04-30 23:02:05
【问题描述】:

我已经在 DI 类中定义了一个 logger Scope

var serviceProvider = serviceCollection.BuildServiceProvider();
var logger =  serviceProvider.GetService<ILogger<Processor>>();

logger.BeginScope(new Dictionary<string, object>
{
    {"system", "MyApplication"},
    {"invocation_id", Guid.NewGuid()}
});

Logger 是这样使用的(工作正常)

public class Processor : IProcessor
{
    private readonly ILogger<Processor> logger;

    public Processor(ILogger<Processor> logger)
    {
        this.logger = logger;
    }

    public void LogMessage()
    {
        logger.LogInformation(""Hello World");
        //Dispose Logger
    }
}

这个记录器完成后如何处理?

【问题讨论】:

  • 一次性物品的规则是“谁创造了一次性物品,就应该处理它”。所以这通常意味着创建记录器范围的同一个类也应该处理它。

标签: c# logging dependency-injection dispose


【解决方案1】:

BeginScope 返回一个 IDisposable,它关闭日志记录范围。 通常我会将我的操作包装在 using 语句中。

var serviceProvider = serviceCollection.BuildServiceProvider();
var logger =  serviceProvider.GetService<ILogger<Processor>>();

using (logger.BeginScope(new Dictionary<string, object>
{
    {"system", "MyApplication"},
    {"invocation_id", Guid.NewGuid()}
})) 
{
    IProcessor processor = new Processor(logger);
    ... do your thing
}

这类似于https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.2#log-scopes的建议

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 2017-11-13
    • 2020-12-03
    • 1970-01-01
    • 2020-12-08
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多