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)
在这种情况下,由于您没有共享任何附加程序,因此您应该能够对附加到记录器的所有附加程序使用 IAppender.Close() 方法(这也会导致它们全部被刷新)。
您应该将记录器转换为 IAppenderAttachable 并在那里获取附加程序表单;这将允许您确保只在嵌套附加程序的顶层调用 Close() 。这应该会导致他们按照正确的顺序冲洗和关闭自己的孩子。
http://logging.apache.org/log4net/release/sdk/html/M_log4net_Appender_IAppender_Close.htm
如果您使用带有配置的标准 log4net 设置,这将非常危险!