我在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是否拥有在根记录器中使用.ForContext()创建的记录器的引用,这会阻止收集子记录器?
答案 0 :(得分:0)
不,调用ILogger.ForContext()
不知道是内存泄漏风险 - Serilog不保留对返回的logger对象的任何引用。