Автор: 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),

}

Кратко, понятно и вообще этот код прекрасно демонстрирует преимущества декларативного стиля программирования над императивным!

Помогла статья? Оцените её!
0 из 5. Общее количество голосов - 0
 

You have no rights to post comments

Дмитрий Крикунов

Публикую статьи, обучающие курсы и новости по программированию: алгоритмам, языкам (С++, Java), параллельному программированию, паттернам и библиотекам (Qt, boost).