Правильный способ отключения экземпляра журнала в log4Net

У меня есть класс, для каждого экземпляра которого я создаю новый регистратор и атташе для приложения-буфера и приложение-фли. Все выполняется во время выполнения, и никакая информация не выбрана из файла конфигурации.

Теперь, чтобы освободить ресурсы в методе пользовательского метода класса, мне нужно закрыть этот конкретный регистратор и выпустить все его подключенные ресурсы, чтобы избежать утечки памяти.

В настоящий момент то, что я делаю, по крайней мере, сбрасывает файл 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();

Надеюсь, я задал свой вопрос достаточно ясно:)

Ответы

Ответ 1

В этом случае, поскольку вы не делитесь никакими приложениями, у вас должна быть возможность использовать метод IAppender.Close() на всех устройствах, подключенных к вашему регистратору (это также приведет к сбросу их всех).

Вы должны привести логгер к IAppenderAttachable и получить там форму appenders; это позволит вам убедиться, что вы вызываете Close() только на верхнем уровне вложенных приложений. Это должно заставить их смывать и закрывать своих детей в правильном порядке.

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

Это будет очень опасно, если вы используете стандартную настройку log4net с конфигурацией!

Ответ 2

Это сработало для меня:

log.Logger.Repository.Shutdown();

или вы можете взять длинный маршрут:

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