Я ищу советы по наилучшему способу динамической перенастройки уровня ведения журнала Log4Net в моих приложениях ASP.NET. Обычно я использую простую конфигурацию, в которой корневой регистратор определяет уровень ведения журнала по умолчанию, например
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="..." />
<appender-ref ref="..." />
... etc ...
</root>
... etc
и может быть несколько приложений, каждое с фильтрами для определения используемых ими уровней ведения журнала.
Первое, что я хотел бы сделать, это разрешить администраторам подключаться к странице администратора, которая позволяет им (а) просматривать текущий уровень для корневого регистратора и (б) динамически изменять его. Я не хочу использовать ConfigureAndWatch и записывать в файл конфигурации на диск, потому что я не хочу, чтобы эти изменения сохранялись при повторном использовании приложения.
Затем я хотел бы пойти дальше и на странице администратора иметь возможность отображать TreeView со всеми текущими регистраторами, которые существуют в приложении, и их текущим уровнем ведения журнала. И позвольте администратору иметь возможность выборочно изменять уровень ведения журнала на любом уровне иерархии.
Идея состоит в том, чтобы создать общую страницу администратора, которую я могу разместить во всех своих приложениях, которая позволяет администраторам выборочно включать динамическое ведение журнала на уровне DEBUG для устранения неполадок.
Я считаю, что API Log4Net немного сбивает с толку, может ли кто-нибудь указать на образцы или показать лучший способ добиться этого.
Обновление:
Оба ответа одинаково хороши, поэтому я принял первый - спасибо. Чтобы повторить попытку, я могу получить все текущие регистраторы следующим образом:
foreach (log4net.ILog log in log4net.LogManager.GetCurrentLoggers())
{
log4net.Repository.Hierarchy.Logger logger =
(log4net.Repository.Hierarchy.Logger)log.Logger;
Debug.WriteLine(
String.Format("{0} Parent {1} Level {2} EffectiveLevel {3}<br>",
logger.Name,
logger.Parent.Name,
logger.Level == null ? "<null>" : logger.Level.Name,
logger.EffectiveLevel
)
);
}
EffectiveLevel - это эффективный уровень, такой же, как и Level, если последний не равен нулю, в противном случае наследуется от родителя.
По крайней мере, один из возвращенных выше регистраторов будет иметь корневой регистратор в качестве родительского, что позволяет мне получить ссылку на корневой регистратор.
С учетом вышеизложенного должно быть возможно восстановить иерархию регистраторов.
Обновление 2
Еще раз спасибо. Я реализовал серверный элемент управления ASP.NET, который отображает иерархию регистратора в TreeView с флажками и позволяет пользователю динамически изменять уровень ведения журнала на любом узле иерархии. Отлично работает, и я буду размещать его на странице администратора во всех моих приложениях ASP.NET Web и Web Service!