2016-06-07 2 views
3

Я использую NLog с конфигурационными файлами. Чтобы избежать войти слишком много вещей для некоторых длительных процедур, которые я делаю такого рода вещи:Как принудительно перезагрузить файл конфигурации NLog?

foreach (LoggingRule rule in LogManager.Configuration.LoggingRules) 
{ 
     rule.DisableLoggingForLevel(LogLevel.Trace); 
     rule.DisableLoggingForLevel(LogLevel.Debug); 
} 
LogManager.ReconfigExistingLoggers(); 

Это позволяет мне временно ухудшить уровень детализации протоколирования. Вышеприведенные строки являются лишь примером для иллюстрации. Это, кажется, отлично работает.

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

LogManager.Configuration.Reload(); 
LogManager.ReconfigExistingLoggers(); 

Я думал, что это будет легко, но configuration.Reload не делать то, что я ожидал, и я не нашел какой-либо другой подходящий метод. После вызова мой журнал еще не хранит трассировки и события отладки, пока они были при запуске программы.

Так что мой вопрос: как программно принудительно перезагрузить NLog.config во время выполнения и восстановить мои «стандартные» настройки регистраторов?

Благодаря

обновление Вопрос более подробно:

Я использую VS2013, .Net 4 Projet с NLog 4.4.0-beta11 (бета, но последний на NuGet), просто "Файл" target, заданный в файле конфигурации с minLevel = Trace и autoReload = True

Регистратор, созданный на уровне класса: private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

Вот мой тест доказательство:

Assert.True(Logger.IsTraceEnabled); 
    Assert.True(Logger.IsDebugEnabled); 

    Logger.Trace("1 - This should appear in log"); 
    Logger.Debug("2 - This should appear in log"); 

    foreach (LoggingRule rule in LogManager.Configuration.LoggingRules) 
    { 
     rule.DisableLoggingForLevel(LogLevel.Trace); 
     rule.DisableLoggingForLevel(LogLevel.Debug); 
    } 
    LogManager.ReconfigExistingLoggers(); 

    Logger.Trace("3 - This should NOT appear in log"); 
    Logger.Debug("4 - This should NOT appear in log"); 
    Logger.Info("5 - This should appear in log"); 

    Assert.False(Logger.IsDebugEnabled); 
    Assert.False(Logger.IsTraceEnabled); 

    LogManager.Configuration.Reload(); 
    LogManager.ReconfigExistingLoggers(); 

    // This is were something goes wrong 

    Logger.Trace("6 - This should appear in log"); // DOES NOTHING 
    Logger.Debug("7 - This should appear in log"); // DOES NOTHING 
    Logger.Info("8 - This should appear in log"); 

    Assert.True(Logger.IsDebugEnabled); // FAILS 
    Assert.True(Logger.IsTraceEnabled); // FAILS 

Сформирован журнал:

TRACE 1 - This should appear in log   
    DEBUG 2 - This should appear in log 
    INFO 5 - This should appear in log 
    INFO 8 - This should appear in log 

В NLog внутреннего журнала я могу увидеть конфигурацию, кажется, были перезагружен без проблем (очень длинный файл, так что я не публикуйте его здесь, если кто-то не спрашивает), но, может быть, существующие регистраторы не обновляются?

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

+1

Это правильный способ его использования. Проверьте внутренний журнал, он расскажет, что происходит во время перезагрузки. – Julian

+0

Здравствуйте. Хорошо знать. Завтра я включу внутренний журнал Nlog с максимальными деталями и информирую вас. Спасибо – AFract

+0

Здравствуйте @Julian. Я разместил выше именно те тесты, которые у меня были, и все еще проблема. Не могли бы вы проверить его? Большое вам спасибо, если я думаю, что вы один из главных авторов NLog, я использую его с большим удовольствием почти для всех моих проектов с многих лет. – AFract

ответ

3

На самом деле, у вас есть ошибка в вашем коде: LogManager.Configuration.Reload() не изменяет конфигурацию регистратора, но загружает конфигурацию из файла NLog.config, десериализует ее и возвращает результат LoggingConfiguration.

для восстановления конфигурации, вам нужно сделать что-то вроде этого:

LogManager.Configuration = LogManager.Configuration.Reload(); 
LogManager.ReconfigExistingLoggers(); 

здесь тестовый пример (MinLevel в примере конфигурации = "DEBUG"):

[TestMethod] 
     public void Test() 
     { 
      Logger.Trace("TRACE 1"); 
      Logger.Debug("DEBUG 1"); 
      Logger.Warn("WARN 1"); 

      foreach (LoggingRule rule in LogManager.Configuration.LoggingRules) 
      { 
       rule.DisableLoggingForLevel(LogLevel.Trace); 
       rule.DisableLoggingForLevel(LogLevel.Debug); 
      } 
      LogManager.ReconfigExistingLoggers(); 

      Logger.Trace("TRACE 2"); 
      Logger.Debug("DEBUG 2"); 
      Logger.Warn("WARN 2"); 

      // Reconfigure(); 
      LogManager.Configuration = LogManager.Configuration.Reload(); 
      LogManager.ReconfigExistingLoggers(); 

      Logger.Trace("TRACE 3"); 
      Logger.Debug("DEBUG 3"); 
      Logger.Warn("WARN 3"); 
     } 

выход:

(DEBUG): DEBUG 1 
(WARN): WARN 1 
// here settings changed 
(WARN): WARN 2 
//here settings reloaded 
(DEBUG): DEBUG 3 
(WARN): WARN 3 
+0

Привет, вы абсолютно правы, я сделал изменения, и все в порядке. К сожалению, я не заметил, что Configuration.Reload() был чистым методом, просто возвращающим определенные параметры, я думал, что его целью было перезагрузить и применить конфигурацию. – AFract

+2

Привет, да, похоже, что это действительно так, но на самом деле это не так ... Я бы переименовал этот метод в «Загрузить», если бы я был разработчиком из команды NLog =) –

+1

Действительно, имя неправильно. Или поведение;) – Julian

Смежные вопросы