Автор: Sergey Teplyakov
В последнее время я работаю над корпоративным приложением, которое состоит из серверной части и из нескольких клиентских. Для логгирования работы этих приложений используюется замечательный инструмент log4net. Его использование обусловлено не тем, что у нас продвинутые пользователи и они будут смотреть, как наше приложение работает, а исключительно удобством решения проблем непосредственно у клиента. Идея предложить пользователю открыть far и ручками поменять logLevel, как-то не вдохновляет, поэтому возникла идея настройки уровней логгирования программным способом. Для этой цели как нельзя лучше подошли новые инструменты в виде LINQ to XML.
// Вызов ToList обусловлен устранением отложенности
// операции Select
var configFiles = (from fn in
Directory.GetFiles(Application.StartupPath, *.log4net).ToList()
select new {Filename = fn, Xml = XDocument.Load(fn)}).ToList(),
// Здесь я получаю набо объектов анонимного класса, которые
// содержат имя конифгурационного файла, имя логгера, уровень
// логгирования, а также атрибут, который нужен для обновления
// уровня логгирования
var loggers = from cf in configFiles
from lvl in cf.Xml.Descendants(level)
let fi = new FileInfo(cf.Filename)
select new { Filename = fi.Name,
Logger = (string)lvl.Parent.Attribute(name),
Level = (string)lvl.Attribute(value),
Attribute = lvl.Attribute(value)},
//Обновление также не составляет труда!
foreach (var l in loggers)
{
l.Attribute.SetValue(INFO),
}
//Теперь нужно сохранить все конфиги обратно
foreach (var cfg in configFiles)
{
cfg.Xml.Save(cfg.Filename),
}
Кратко, понятно и вообще этот код прекрасно демонстрирует преимущества декларативного стиля программирования над императивным!