17

我目前CloudConfigurationManager.GetSetting("setting")用于获取我的应用程序的设置,但它正在将它正在检查的所有内容的日志写入控制台(在调试和发布中):

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

有没有办法阻止它这样做,或者有一个不那么冗长的替代版本?

大多数情况下,我只是希望我的单元测试输出干净整洁,但我也有点担心它会在生产服务器上以纯文本形式打印出连接字符串(以及密码)等内容。

4

8 回答 8

13

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

于 2016-04-27T15:55:59.990 回答
12

并不真地。如果您查看底层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 总是在不考虑调试或发布的情况下被调用。现在您可以简单地删除应该抑制所有消息的默认侦听器:

  <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 的作用远不止于此,例如在没有程序集引用的情况下加载程序集。

于 2012-10-11T10:33:52.883 回答
1

替代选项,如果您在一部分中调用 CloudConfigurationManager.GetSetting()(即,包装器/帮助器类):

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

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

首先,我们删除 Trace 上的所有侦听器。然后我们抓取设置,并重新添加监听器。当然,这可能会导致线程应用程序出现问题

于 2014-10-18T08:13:04.107 回答
1

我刚刚安装了nuget 包 Microsoft.WindowsAzure.ConfigurationManager版本 3.1.0,我可以确认该问题已在此版本中得到修复。查看问题评论中引用的github issue,我们可以看到,在changelog中,获取的值不再写入跟踪输出。特别是,跟踪消息已更改为:

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

至:

message = "PASS";

尽管如此,这仍然使配置管理器非常冗长。

于 2015-05-23T12:16:12.953 回答
0

已在 3.0.0 版中修复。请更新 Microsoft Azure 配置管理器 nuget 包。

于 2015-03-18T18:56:57.800 回答
0

我有非常相似的问题。我从 Azure SDK 2.0 更新到 2.2 - 在此过程中,我使用 NuGet 管理器将 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 加载程序集并调用函数(通过反射)的方式。

于 2013-11-10T20:13:54.180 回答
0

我们自己也遇到了这个……太令人沮丧了。

我们无法删除默认侦听器,因为我们在上面记录了我们自己的东西。

不过有一个简单的解决方法。只需使用老式的ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"],您将获得所需的信息,而无需烦人的日志记录。

希望有帮助,大卫

于 2013-02-14T00:10:42.837 回答
0

这里有两个单独的问题:

  1. 设置值以纯文本形式记录(安全问题)
  2. 每次检索设置时都会记录消息(冗长问题)

正如其他人所指出的,#1 已在更新版本的插件中得到修复。

根据我的经验(以及这里的一些其他回复),#2 仍然是一个巨大的烦恼。

查看 Visual Studio 的队列编辑器中的 WADLogsTable,请注意消息级别为 5(即verbose,根据此 ETW 级别列表)。

脱离诊断配置文件模式,我解决问题 #2 的方法是将通用跟踪的最低严重级别(例如警告、信息、详细)限制为“信息”(或更严重),并确保我自己的日志记录确实如此不要使用“详细”级别。

这是我在 diagnostics.wadcfgx 中所做的更改:

原来的:

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

固定的:

<Logs scheduledTransferPeriod="PT1M" scheduledTransferLogLevelFilter="Information" />
于 2015-12-18T23:30:23.923 回答