Могу ли я изменить конфигурацию блока ведения журнала Enterprise Library во время выполнения? - PullRequest
2 голосов
/ 09 марта 2009

Не вдаваясь в обсуждение достоинств или какого-либо иного блока ведения журнала EntLib, есть ли способ изменить его конфигурацию во время выполнения?

Например, у меня есть блок, настроенный на запись общих событий в плоский файл и критических событий в журнал событий.
Есть ли способ изменить его, чтобы записывать общие события на консоль и т. Д., Без перезапуска моего приложения?

Уточнение: Я пишу долго работающее серверное приложение. Я хотел бы иметь возможность временно увеличить многословность / вывод различных групп ведения журнала для целей диагностики / устранения неполадок без перезапуска приложения. Перезапуск не возможен, так как он будет означать «сайт недоступен».

Ответы [ 2 ]

5 голосов
/ 23 ноября 2009

На самом деле это довольно легко достичь, просто выполните следующие действия:

Поместить конфигурацию Enterprise Library в отдельный файл

<configuration>
  <configSections>
    <section name="enterpriseLibrary.ConfigurationSource" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>
  <enterpriseLibrary.ConfigurationSource selectedSource="EntLib Config">
    <sources>
      <add name="EntLig Config" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          filePath="EntLib.config" />
    </sources>
  </enterpriseLibrary.ConfigurationSource>
</configuration>

Добавить фильтр регистрации. Вы можете использовать приоритеты или категории записей журнала для фильтрации записей журнала, поэтому в своем коде вы должны соответственно установить приоритет или категорию. Например, вы хотите дать очень важные сообщения и номер с низким приоритетом, например, 1, и более подробное сообщение может быть 10.

<configuration>
  ...
  <loggingConfiguration name="Logging Application Block" tracingEnabled="true"
    defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
    ...
    <logFilters>
      <add minimumPriority="1" maximumPriority="10" type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.PriorityFilter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        name="Priority Filter" />
    ...
  </loggingConfiguration>
</configuration>

Любые изменения, внесенные в конфигурацию Enterprise Library во время выполнения, игнорируются - за исключением изменений, внесенных в блок приложения ведения журнала. См. Этот пост в MSDN: Обновление параметров конфигурации во время выполнения

Я реализовал простой вспомогательный метод для переключения значений фильтра: когда я хочу больше подробных сообщений, я разрешаю регистрировать эти записи, увеличивая максимальное значение приоритета. Аналогичным образом, когда я хочу, чтобы регистрировались только исключения или другие очень важные сообщения, я устанавливаю диапазон приоритетов от 0 до 1.

var path = System.IO.Path.Combine(Environment.CurrentDirectory, "EntLib.config");
var xd = XDocument.Load(path);

var x = (from z in xd.Root.Elements("loggingConfiguration").Elements("logFilters").Elements() where (z.Attribute("name").Value == "Priority Filter") select z).SingleOrDefault();
x.Attribute("minimumPriority").Value = 1; // Change this value...
x.Attribute("maximumPriority").Value = 5; // ... and this one to specify the range you want to log.

xd.Save(path);

Это изменит функциональность ведения журнала корпоративной библиотеки без перезагрузки службы, так как web.config никогда не затрагивается. Единственным недостатком является то, что требуется, чтобы вы использовали соглашение типа soem для определения приоритетов / классификации записей журнала.

1 голос
/ 09 марта 2009

Я знаю, что вы можете открыть ConfigurationFileMap и изменить конфигурацию для регистратора. Однако я не уверен, решит ли это проблему так, как вам хотелось бы, поскольку при сохранении файла конфигурации происходит сброс приложения, и вам придется установить его по умолчанию. Это большая работа, чтобы просто подключить консоль.

Поскольку в блоке журналирования используется модель провайдера, вы сможете подключиться к нему во время выполнения, но я не уверен, как это сделать. Однако у вас есть полный исходный код для EntLib, поэтому пробежка по стеку кода, чтобы понять это, не должна быть основной работой. Вам даже не нужно задумываться над кодом, чтобы взломать его.

Я полагаю, ваша цель - смотреть приложение в режиме реального времени?

...