【问题标题】:Can Serilog ForContext cause memory leak?Serilog ForContext 会导致内存泄漏吗?
【发布时间】: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


    【解决方案1】:

    不,调用 ILogger.ForContext() 不存在内存泄漏风险 - Serilog 不会保留对返回的记录器对象的任何引用。

    【讨论】:

    • 感谢 Nicholas 的回答。事实上,看着你的blog post,你似乎也暗示 ForContext 可以安全地根据请求使用。 Serilog 的文档表明在根记录器上调用 Dispose 就足够了,您不需要在子记录器上执行此操作。然后我假设子记录器(使用 ForContext 创建)使用由根记录器创建的接收器、网络句柄等。
    猜你喜欢
    • 2021-03-23
    • 2021-09-25
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2011-06-16
    • 2011-10-28
    相关资源
    最近更新 更多