我目前正在使用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=...
有没有办法阻止它这样做,或者是一个不那么冗长的替代版本?
大多数情况下,我只是喜欢我的单元测试输出很干净,但我也有点担心它会在生产服务器上以纯文本形式打印连接字符串(以及密码)等内容。
答案 0 :(得分:11)
不是真的。如果您查看基础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的功能远不止这些,例如加载没有程序集引用的程序集。
答案 1 :(得分:11)
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
答案 2 :(得分:1)
替代选项,如果您在一个部分中调用CloudConfigurationManager.GetSetting()(即包装器/辅助类):
var oldListeners = Trace.Listeners.Cast<TraceListener>().ToArray();
Trace.Listeners.Clear();
var stringValue = CloudConfigurationManager.GetSetting(key);
Trace.Listeners.AddRange(oldListeners);
首先,我们删除Trace上的所有侦听器。然后我们抓取设置,并重新添加监听器。当然,这可能会导致线程应用程序出现问题
答案 3 :(得分:1)
我刚刚安装了nuget package Microsoft.WindowsAzure.ConfigurationManager
版本3.1.0,我可以确认此版本已解决此问题。看一下问题评论中引用的github issue,我们可以看到,在changelog中,获取的值不再写入跟踪输出。特别是,跟踪消息已从以下更改:
message = string.Format(CultureInfo.InvariantCulture, "PASS ({0})", value);
为:
message = "PASS";
但这仍然使配置管理器非常冗长。
答案 4 :(得分:0)
我们自己也遇到过这种情况......非常令人沮丧。
我们无法删除默认侦听器,因为我们正在记录它们自己的东西。
虽然有一个简单的解决方法。只需使用优质的老式ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"]
,您就可以获得所需的信息,而无需烦人的日志记录。
希望有所帮助, 大卫
答案 5 :(得分:0)
我遇到了类似的问题。我从Azure SDK 2.0更新到2.2 - 在此过程中,我使用NuGet Manager将Microsoft.WindowsAzure.Storage更新为最新版本。 PackageManager自动将Microsoft.WindowsAzure.Configuration置于1.8.0.0。我无法运行(这是.Net 2.0!?)。手动将所有引用设置为
后我认为这是因为CloudConfigurationManager.GetSetting加载程序集并调用funktions(通过反射)的方式。
答案 6 :(得分:0)
已在3.0.0版中修复。请更新Microsoft Azure Configuration Manager nuget包。
答案 7 :(得分:0)
这里有两个不同的问题:
正如其他人所说,#1已在更新版本的插件中得到修复。
根据我的经验(以及其他一些回复),#2仍然是一个巨大的烦恼。
在Visual Studio的队列编辑器中查看WADLogsTable,请注意消息级别为5(即详细,根据this list of ETW levels)。
离开the diagnostic config file schema,我解决问题#2的方法是将通用追踪的最低严重程度(例如警告,信息,详细)限制为&#34;信息&#34; (或更严重)并确保我自己的日志记录没有使用&#34;详细&#34;水平。
以下是我在diagnostics.wadcfgx中所做的更改:
原件:
<Logs scheduledTransferPeriod="PT1M" scheduledTransferLogLevelFilter="Verbose" />
修正:
<Logs scheduledTransferPeriod="PT1M" scheduledTransferLogLevelFilter="Information" />