Я использую 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.
Это правильный способ его использования. Проверьте внутренний журнал, он расскажет, что происходит во время перезагрузки. – Julian
Здравствуйте. Хорошо знать. Завтра я включу внутренний журнал Nlog с максимальными деталями и информирую вас. Спасибо – AFract
Здравствуйте @Julian. Я разместил выше именно те тесты, которые у меня были, и все еще проблема. Не могли бы вы проверить его? Большое вам спасибо, если я думаю, что вы один из главных авторов NLog, я использую его с большим удовольствием почти для всех моих проектов с многих лет. – AFract