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

本文关键字:方法 实例 记录器 log4Net | 更新日期: 2023-09-27 17:54:42

我有一个类,我为它的每个实例创建一个新的记录器,并附加一个缓冲区追加器和一个苍蝇追加器。一切都在运行时完成,没有从配置文件中选择任何信息。

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

目前我所做的是至少刷新文件附加程序并写入所有日志信息,但这既不会释放对特定日志文件的锁,也不会释放其任何资源。

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

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();

我希望我已经把我的问题说得够清楚了。

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

这对我有用:

log.Logger.Repository.Shutdown();

或者你可以走长路线:

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

在本例中,由于您没有共享任何appender,因此您应该能够对附加到记录器的所有appender使用IAppender.Close()方法(这也将导致它们全部刷新)。

你应该将记录器强制转换为IAppenderAttachable,并在那里获得appeners表单;这将允许您确保仅在嵌套追加器的顶层调用Close()。这将导致它们以正确的顺序冲洗和关闭自己的子进程。

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

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