Как заставить перезагрузить файл конфигурации 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();

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

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

Спасибо

Обновление вопроса с более подробной информацией:

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

Создание журнала на уровне класса: частное статическое чтение только для 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.

 AFract07 июн. 2016 г., 22:14
Привет. Хорошо знать. Завтра я включу внутренний журнал Nlog с максимальной информацией и буду держать вас в курсе. Спасибо
 AFract08 июн. 2016 г., 10:56
Джонни Сварог дал ответ. Я чувствую себя немного глупо, что не заметил такой простой вещи :)
 Julian07 июн. 2016 г., 22:07
Это правильный способ его использования. Проверьте внутренний журнал, он расскажет, что происходит при перезагрузке.
 AFract08 июн. 2016 г., 09:49
Привет, Джулиан. Я опубликовал выше точно тест, который я сделал, и все еще имею проблему. Не могли бы вы проверить это? Большое спасибо, если мне кажется, что вы один из главных авторов NLog, я использую его с большим удовольствием почти для всех моих проектов на протяжении многих лет.

Ответы на вопрос(1)

Решение Вопроса

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

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

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

Вот тестовый пример (minLevel в примере config = "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
 Julian08 июн. 2016 г., 11:16
На самом деле имя неверно. Или поведение;)
 Johnny Svarog08 июн. 2016 г., 11:00
Привет, да, похоже, что он действительно должен работать таким образом, но на самом деле это не так ... Я бы переименовал этот метод в «Load», если бы я был разработчиком из команды NLog =)
 MrLister02 мая 2017 г., 00:03
Тогда это: NLog.LogManager.Configuration = new NLog.Config.XmlLoggingConfiguration (NLogConfigFile_Dst, true); NLog.LogManager.ReconfigExistingLoggers (); следует сделать то же самое ... загрузить конфигурацию из файла, а затем перенастроить регистраторы - правильно?
 AFract08 июн. 2016 г., 10:54
Здравствуйте, вы абсолютно правы, я сделал изменения, и теперь все в порядке. Извините, я не заметил, что Configuration.Reload () был чистым методом, просто возвращающим определенные настройки, я думал, что его целью было перезагрузить и применить конфигурацию.

Ваш ответ на вопрос