.Net Core 2.1日志记录提供程序-我应该维护记录器实例吗?

时间:2019-01-25 17:53:35

标签: logging .net-core

因此,我正在实现一个自定义.Net Core LoggerProvider,在某些示例中,我注意到该提供程序中对CreateLogger的每次调用都在(并发)字典中维护了对每个记录器的引用,因此代码如下: / p>

private readonly ConcurrentDictionary<string, ILogger> _loggers = new 
ConcurrentDictionary<string, ILogger>();

 public ILogger CreateLogger(string name)
 {
     if (_loggers.ContainsKey(name))
     {
         return _loggers[name];
     }

     var newLogger = new CustomLogger();
     _loggers.GetOrAdd(name, newLogger);
     return newLogger;
 }

在每次请求时都返回相同实例是否有负面影响,实际上在应用程序的生命周期内将每个实例视为一个实例?

1 个答案:

答案 0 :(得分:0)

此机制用于为每个记录器提供单独的categoryName。如果您不使用类别名称,则不需要字典,您只需返回一个新的或单例记录器实例即可。

这实际上取决于您想要什么以及每个记录器的寿命。不过,通常情况下,您会按照类别(例如MyApp.SomeApiClient)实例化记录器,并在应用程序生命周期中多次记录日志(例如,每秒记录一次)。在这种情况下,与其每次都返回一个新的记录器,不如按类别保存记录器,这样可以节省您重新创建记录器的开销。

可以说,当您不经常重用记录器实例时,您现在会占用不必要的额外内存,但是我可以说所有这些方法通常是99.99%用例的最佳选择。当然,使用并发字典会产生开销。

因此,简而言之,您只需要实例来记住正确的类别名称,否则就可以不用它,但是可以节省一些对象分配/销毁。