Serilog ForContext 会导致内存泄漏吗?
Can Serilog ForContext cause memory leak?
我在 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();
对于服务接收到的每个请求,都会实例化一个短暂的处理程序 class 并通过 DI 在 ctor 中接收记录器:
private ILogger _logger;
public RequestHandler(ISessionStorageProvider sessionStorageProvider, ILogger logger)
{
_sessionStorageProvider = sessionStorageProvider;
_logger = logger.ForContext<CreateSessionHandler>();
}
然后它在上面的根记录器上使用 ForContext() 调用实例化 ILogger 的私有实例。
问题是,一旦这个处理程序被垃圾回收,它的私有实例 _logger 是否也会被回收?或者 Serilog 是否在根记录器中持有使用 .ForContext() 创建的记录器的引用,这将阻止收集子记录器?
不,不知道调用 ILogger.ForContext()
是否存在内存泄漏风险 - Serilog 不会保留对返回的记录器对象的任何引用。
我在 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();
对于服务接收到的每个请求,都会实例化一个短暂的处理程序 class 并通过 DI 在 ctor 中接收记录器:
private ILogger _logger;
public RequestHandler(ISessionStorageProvider sessionStorageProvider, ILogger logger)
{
_sessionStorageProvider = sessionStorageProvider;
_logger = logger.ForContext<CreateSessionHandler>();
}
然后它在上面的根记录器上使用 ForContext() 调用实例化 ILogger 的私有实例。
问题是,一旦这个处理程序被垃圾回收,它的私有实例 _logger 是否也会被回收?或者 Serilog 是否在根记录器中持有使用 .ForContext() 创建的记录器的引用,这将阻止收集子记录器?
不,不知道调用 ILogger.ForContext()
是否存在内存泄漏风险 - Serilog 不会保留对返回的记录器对象的任何引用。