Как сделать CloudConfigurationManager.GetSetting менее подробным?

В настоящее время я использую CloudConfigurationManager.GetSetting("setting"), чтобы получить настройки для моего приложения, но он записывает журналы всего, что он проверяет на консоли (в как Debug и Release):

Getting "setting" from ServiceRuntime: FAIL.
Getting "setting" from ConfigurationManager: PASS (Data Source=...
Getting "setting" from ServiceRuntime: FAIL.
Getting "setting" from ConfigurationManager: PASS (Data Source=...

Есть ли способ предотвратить это или альтернативную версию, которая менее сложна?

В основном я просто хочу, чтобы мой вывод unit test был приятным и чистым, но я также немного обеспокоен тем, что он печатает такие вещи, как строки подключения (и, следовательно, пароли), в виде простого текста на рабочем сервере.

Ответы

Ответ 1

Не совсем. Если вы посмотрите на код базового метода GetValue, вы увидите следующее:

private static string GetValue(string providerName, string settingName, Func<string, string> getValue)
{
  string str1 = getValue(settingName);
  string str2;
  if (str1 != null)
    str2 = string.Format((IFormatProvider) CultureInfo.InvariantCulture, "PASS ({0})", new object[1]
    {
      (object) str1
    });
  else
    str2 = "FAIL";
  Trace.WriteLine(string.Format((IFormatProvider) CultureInfo.InvariantCulture, "Getting \"{0}\" from {1}: {2}.", (object) settingName, (object) providerName, (object) str2));
  return str1;
}

Trace.WriteLine всегда вызывается без учета Debug или Release. Теперь вы можете просто удалить прослушиватель по умолчанию, который должен подавлять все сообщения:

  <system.diagnostics>
    <trace>
      <listeners>
        <remove name="Default" />
      </listeners>
    </trace>
  </system.diagnostics>

Теперь, если вы посмотрите на CloudConfigurationManager, это не так. Если это проблема для вас, вы можете сами что-то приготовить, начиная с этого:

        if (RoleEnvironment.IsAvailable)
            return RoleEnvironment.GetConfigurationSettingValue(setting);
        else
            return ConfigurationManager.AppSettings[setting];

Примечание. CloudConfigurationManager выполняет намного больше, чем это, например, загружает сборку без ссылки на сборку.

Ответ 2

CloudConfigurationManager.GetSetting теперь имеет метод перегрузки с параметром outputResultsToTrace.

Если вы передадите false этому методу, он отключит Trace.WriteLine, используемый в другом месте, для "спама" журнала Trace.

Итак,

var mySetting = CloudConfigurationManager.GetSetting("MySetting");

становится

var mySetting = CloudConfigurationManager.GetSetting("MySetting", false);

Я нашел это, посмотрев прямо на исходный код GitHub: https://github.com/Azure/azure-sdk-for-net/blob/52fc67253a176bea01c37c164f71c7eba8eaedba/src/Common/Configuration/CloudConfigurationManager.cs#L35

Возможно, стоит упомянуть, что эта перегрузка не документирована: https://msdn.microsoft.com/en-us/library/azure/mt634648.aspx

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

Это изменение было внесено в конце 2015 года: https://github.com/Azure/azure-sdk-for-net/commit/e14398136d7d3b6d5e4675f1e8ccbdd37a8c6b01

Ответ 3

Альтернативный вариант, если вы вызываете CloudConfigurationManager.GetSetting() в одной части (т.е. класс оболочки/помощника):

var oldListeners = Trace.Listeners.Cast<TraceListener>().ToArray();
Trace.Listeners.Clear();

var stringValue = CloudConfigurationManager.GetSetting(key);
Trace.Listeners.AddRange(oldListeners);

Сначала мы удаляем всех слушателей на Trace. Затем мы захватываем настройку и снова добавляем слушателей. Конечно, это потенциально может вызвать проблемы с потоковыми приложениями

Ответ 4

Я только что установил пакет nuget Microsoft.WindowsAzure.ConfigurationManager версия 3.1.0, и я могу подтвердить, что проблема исправлена ​​в этой версии. Взглянув на github issue, на который ссылаются в комментариях к вопросу, мы можем видеть в changelog, выбранное значение больше не записывается в вывод трассировки. В частности, сообщение трассировки было изменено с:

message = string.Format(CultureInfo.InvariantCulture, "PASS ({0})", value);

в

message = "PASS";

Это все еще делает диспетчер конфигурации довольно подробным.

Ответ 5

Мы просто наткнулись на это сами... так очень разочаровываем.

Мы не можем удалить прослушиватель по умолчанию, потому что мы записываем на него свои собственные материалы.

Однако есть простой способ обхода проблемы. Просто используйте добрый старомодный ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"], и вы получите необходимую информацию без раздражающего ведения журнала.

Надеюсь, что это поможет, Дэвид

Ответ 6

У меня были подобные проблемы. Я обновил с Azure SDK 2.0 до 2.2 - во время этого процесса я использовал NuGet Manager для обновления Microsoft.WindowsAzure.Storage до последнего. PackageManager автоматически выполнил Microsoft.WindowsAzure.Configuration до 1.8.0.0. Мне не удалось это запустить (это было для .Net 2.0!?). После того, как я вручную установил все ссылки в

  • Microsoft.WindowsAzure.Storage 2.1.0.0
  • Microsoft.WindowsAzure.Configuration 2.0.0.0

все сработало.

Я думаю, это связано с тем, как CloudConfigurationManager.GetSetting загружает сборку и вызывает функции (через отражение).

Ответ 7

Исправлено в версии 3.0.0. Обновите пакет nuget для Microsoft Azure Configuration Manager.

Ответ 8

Здесь есть два отдельных вопроса:

  • Значения параметров регистрируются в виде обычного текста (проблема безопасности)
  • Сообщения регистрируются каждый раз, параметр извлекается (проблема с подробностью)

Как отмечали другие, # 1 исправлено в более новой версии плагина.

Основываясь на моем опыте (и некоторых других ответах здесь), №2 по-прежнему является огромным раздражением.

Глядя на WADLogsTable в редакторе очереди Visual Studio, обратите внимание, что уровень сообщения равен 5 (т.е. подробный, в соответствии с этот список Уровни ETW).

Отключение схемы диагностического конфигурационного файла, мой подход к решению проблемы № 2 заключался в том, чтобы ограничить минимальный уровень серьезности (например, предупреждение, информационное, подробный) общей трассировки на "информацию" (или более серьезную) и просто обеспечить, чтобы мой собственный журнал не использовал "подробный" уровень.

Вот изменение, которое я сделал в диагностике .wadcfgx:

Оригинал:

<Logs scheduledTransferPeriod="PT1M" scheduledTransferLogLevelFilter="Verbose" />

Fixed

<Logs scheduledTransferPeriod="PT1M" scheduledTransferLogLevelFilter="Information" />