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

时间:2011-05-05 05:07:51

标签: c# .net 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();

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

2 个答案:

答案 0 :(得分:23)

这对我有用:

log.Logger.Repository.Shutdown();

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

foreach (log4net.Appender.IAppender app in log.Logger.Repository.GetAppenders()) {
    app.Close();
}

答案 1 :(得分:3)

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

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

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

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