Правильный способ отключения экземпляра журнала в 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();
}