【发布时间】:2018-07-17 15:49:42
【问题描述】:
我在 Web 服务应用程序中有此配置:
当应用程序启动时,会创建一个根记录器。此记录器注册为单例并在整个应用程序中使用:
ILogger _logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.Filter.ByExcluding(e => (int)e.Level < (int)minimumLogLevel)
.WriteTo
.ApplicationInsights(TelemetryConfiguration.Active, (logEvent, formatter) => new TelemetryBuilder(logEvent, formatter)
.LogEventToTelemetryConverter())
.CreateLogger();
对于服务接收到的每个请求,都会实例化一个短暂的处理程序类,并通过 DI 接收 ctor 中的记录器:
private ILogger _logger;
public RequestHandler(ISessionStorageProvider sessionStorageProvider, ILogger logger)
{
_sessionStorageProvider = sessionStorageProvider;
_logger = logger.ForContext<CreateSessionHandler>();
}
然后它在上面的根记录器上使用 ForContext() 调用实例化 ILogger 的私有实例。
问题是,一旦这个处理程序被垃圾回收,它的私有实例 _logger 也会被回收吗?还是 Serilog 在根 logger 中保存了使用 .ForContext() 创建的 logger 的引用,这会阻止子 logger 被收集?
【问题讨论】:
标签: logging memory-leaks serilog