Правильный способ отключения экземпляра регистратора в log4Net - PullRequest
16 голосов
/ 05 мая 2011

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

Теперь, чтобы освободить ресурсы с помощью пользовательского метода 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 ]

23 голосов
/ 15 марта 2014

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

log.Logger.Repository.Shutdown();

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

foreach (log4net.Appender.IAppender app in log.Logger.Repository.GetAppenders()) {
    app.Close();
}
3 голосов
/ 05 мая 2011

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

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

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

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

...