Настройте log4net или NLog с XML из кода - PullRequest
4 голосов
/ 30 ноября 2010

Недавно я работал над проектом, в котором, помимо прочего, мы хотим предоставить централизованную систему конфигурации. Мы используем WCF, Silverlight, C # и т. Д. Для создания распределенной системы сервисов и клиентов. Одна из вещей, которые мы хотим настроить, это регистрация. Очевидно, что мы можем настроить log4net или NLog через app.config или через отдельный файл конфигурации регистрации. Мы также можем настроить с помощью кода. Я хотел посмотреть, возможно ли настроить через XML из кода. Другими словами, представьте, что у вас в памяти (может быть, прочитано из базы данных?) Весь XML, необходимый для настройки любой среды ведения журналов. Это можно сделать? Можно ли настроить log4net и / или NLog через строку, содержащую правильно сформированную (в контексте конкретной структуры ведения журнала), а не чтение из файла или через «обычную» конфигурацию API?

Я выяснил, как это сделать для каждой из этих структур журналирования. Я не уверен, что мы на самом деле будем его использовать, но я подумал, что поделюсь этим здесь на SO, на тот случай, если кто-то еще может найти это полезным. Кроме того, не стесняйтесь комментировать целесообразность (или нет) настройки каркасов ведения журнала таким образом.

Две очевидные потенциальные проблемы, о которых я могу подумать:

  1. Может быть трудно создать действительный XML (или ввести его в базу данных). Мое первое предположение состоит в том, что можно определить XML так же, как сегодня. Поместите его в файл app.config (или внешний конфигурационный файл), а затем запустите тестовую программу, чтобы убедиться, что XML дает ожидаемые результаты.

  2. Насколько легко или сложно (или невозможно) обновить XML в базе данных, а затем заставить программу / службу / что-либо еще реагировать на изменение (например, с помощью опции ConfigureAndWatch в log4net)? Меня не интересует, как программа или служба узнают, что XML был обновлен. Давайте просто предположим, что программа будет периодически проверять базу данных. Учитывая новую строку XML, достаточно легко перенастроить каркасы ведения журналов.

Я опубликую свою технику в качестве ответа на этот вопрос.

1 Ответ

9 голосов
/ 30 ноября 2010

Настройка log4net через XML в коде:

  string xml =
  @"<log4net>
    <appender name='file1' type='log4net.Appender.RollingFileAppender'>
      <!-- Log file locaation -->
      <param name='File' value='log4net.log'/>
      <param name='AppendToFile' value='true'/>
      <!-- Maximum size of a log file -->
      <maximumFileSize value='2KB'/>
      <!--Maximum number of log file -->
      <maxSizeRollBackups value='8'/>
      <!--Set rolling style of log file -->
      <param name='RollingStyle' value='Composite'/>
      <param name='StaticLogFileName' value='false'/>
      <param name='DatePattern' value='.yyyy-MM-dd.lo\g'/>
      <layout type='log4net.Layout.PatternLayout'>
        <param name='ConversionPattern' value='%d [%t] %-5p  %m%n'/>
      </layout>
    </appender>

    <!-- Appender layout fix to view in console-->
    <appender name='console' type='log4net.Appender.ConsoleAppender'>
      <layout type='log4net.Layout.PatternLayout'>
        <param name='Header' value='[Header]\r\n'/>
        <param name='Footer' value='[Footer]\r\n'/>
        <param name='ConversionPattern' value='%d [%t] %-5p  %m%n'/>
      </layout>
    </appender>

    <appender name='debug' type='log4net.Appender.DebugAppender'>
      <layout type='log4net.Layout.PatternLayout'>
        <param name='ConversionPattern' value='%d [%t] %logger %-5p %m%n'/>
      </layout>
    </appender>
    <root>
      <level value='INFO'/>
      <!--
            Log level priority in descending order:

            FATAL = 1 show  log -> FATAL 
            ERROR = 2 show  log -> FATAL ERROR 
            WARN =  3 show  log -> FATAL ERROR WARN 
            INFO =  4 show  log -> FATAL ERROR WARN INFO 
            DEBUG = 5 show  log -> FATAL ERROR WARN INFO DEBUG
            -->
      <!-- To write log in file -->
      <appender-ref ref='debug'/>
      <appender-ref ref='file1'/>
    </root>

  </log4net>";

  XmlDocument doc = new XmlDocument();
  doc.LoadXml(xml);

  log4net.Config.XmlConfigurator.Configure(doc.DocumentElement);

Настройка NLog через XML в коде (работает для NLog 2.0 и более поздних версий):

  string xml = @"<nlog> 
                   <targets> 
                     <target name='console' type='Console' layout='${message}' /> 
                   </targets> 

                   <rules> 
                     <logger name='*' minlevel='Error' writeTo='console' /> 
                   </rules> 
                 </nlog>"; 

  StringReader sr = new StringReader(xml); 
  XmlReader xr = XmlReader.Create(sr); 
  XmlLoggingConfiguration config = new XmlLoggingConfiguration(xr, null); 
  LogManager.Configuration = config; 
  //NLog is now configured just as if the XML above had been in NLog.config or app.config

До NLog 2.0 объект XmlLoggingConfiguration NLog не принимает XmlReader в своем конструкторе. Вместо этого вы можете передать XmlElement, например так:

  string xml = @"<nlog>  
               <targets>  
                 <target name='debugger' type='Console' layout='${message}' />  
               </targets>  

               <rules>  
                 <logger name='*' minlevel='Error' writeTo='console' />  
               </rules>  
             </nlog>";

  XmlDocument doc = new XmlDocument();
  doc.LoadXml(xml);

  XmlLoggingConfiguration config = new XmlLoggingConfiguration(doc.DocumentElement,null);
  LogManager.Configuration = config;

Чтобы обновить конфигурацию с учетом новой строки XML, просто повторите шаги для конкретной используемой среды ведения журналов.

...