在log4Net中关闭记录器实例的正确方法

Bas*_*wer 16 .net c# logging log4net

我有一个类,我的每个实例都创建一个新的记录器,并附加一个缓冲appender和一个flie appender.一切都在运行时完成,并且没有从配置文件中选取任何信息.

现在要在类的自定义dispose方法中释放资源,我需要关闭该特定的记录器并释放其所有附加的资源,以避免任何内存泄漏.

目前我一直在做的是至少刷新文件appender并写入所有日志记录信息但是既没有释放该特定日志文件的锁也没有释放它的任何资源.

在不关闭正在进行的其他活动记录器的情况下关闭记录器的正确方法是什么

log4net.ILog log = log4net.LogManager.GetLogger(loggerName);

foreach (IAppender iapp in log.Logger.Repository.GetAppenders())
{
    BufferingAppenderSkeleton buffered = iapp as BufferingAppenderSkeleton;
    if (buffered is BufferingForwardingAppender)
    {
        ((BufferingForwardingAppender)buffered).Flush();
    }
}

log.Logger.Repository.Shutdown();
Run Code Online (Sandbox Code Playgroud)

我希望我的问题足够明确:)

JJ_*_*ire 23

这对我有用:

log.Logger.Repository.Shutdown();
Run Code Online (Sandbox Code Playgroud)

或者你可以采取漫长的路线:

foreach (log4net.Appender.IAppender app in log.Logger.Repository.GetAppenders()) {
    app.Close();
}
Run Code Online (Sandbox Code Playgroud)

  • 来自[docs](http://logging.apache.org/log4net/log4net-1.2.13/release/sdk/log4net.Repository.ILoggerRepository.Shutdown.html):`备注:关闭存储库将安全关闭删除所有记录器中的所有appender,包括根记录器.在应用程序存在之前,需要关闭一些appender.否则,挂起的日志记录事件可能会丢失.Shutdown方法在关闭常规appender之前小心关闭嵌套的appender.这允许将常规appender附加到记录器并再次连接到嵌套appender的配置 (3认同)
  • 好奇是否有办法重新启动它?我在看的是关机、保存/发送日志文件、启动。 (2认同)

jed*_*igo 3

在这种情况下,由于您没有共享任何附加程序,因此您应该能够对附加到记录器的所有附加程序使用 IAppender.Close() 方法(这也会导致它们全部被刷新)。

您应该将记录器转换为 IAppenderAttachable 并在那里获取附加程序表单;这将允许您确保只在嵌套附加程序的顶层调用 Close() 。这应该会导致他们按照正确的顺序冲洗和关闭自己的孩子。

http://logging.apache.org/log4net/release/sdk/html/M_log4net_Appender_IAppender_Close.htm

如果您使用带有配置的标准 log4net 设置,这将非常危险!

  • 但有没有办法关闭 Ilog 实例? (3认同)
  • 你需要调用 -------> log4net.ILog log = log4net.LogManager.GetLogger(loggerName); log4net.Repository.Hierarchy.Logger l = (log4net.Repository.Hierarchy.Logger)log.Logger; l.RemoveAllAppenders(); (2认同)