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.WriteLineTrace

それで

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の問題を見ると、変更ログ、フェッチされた値がトレース出力に書き込まれなくなっていることがわかります。特に、トレースメッセージは次のように変更されました。

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

に:

message = "PASS";

ただし、これでも構成マネージャーは非常に冗長になります。

于 2015-05-23T12:16:12.953 に答える
0

私たちは自分たちでこれに遭遇しました...とてもイライラします。

独自のものをログに記録しているため、デフォルトのリスナーを削除することはできません。

ただし、簡単な回避策があります。古き良き時代を使用するだけConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"]で、煩わしいロギングなしで必要な情報を取得できます。

お役に立てば幸いです、David

于 2013-02-14T00:10:42.837 に答える
0

私は非常によく似た問題を抱えていました。Azure SDK 2.0から2.2に更新しました。このプロセス中に、NuGetManagerを使用して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

バージョン3.0.0で修正されました。Microsoft AzureConfigurationManagerのnugetパッケージを更新してください。

于 2015-03-18T18:56:57.800 に答える
0

ここには2つの別々の問題があります。

  1. 設定値はプレーンテキストで記録されます(セキュリティ上の懸念)
  2. 設定が取得されるたびにメッセージがログに記録されます(冗長性の懸念)

他の人が指摘しているように、#1はプラグインのより新しいバージョンで修正されています。

私の経験(およびここにある他のいくつかの応答)に基づくと、#2は依然として大きな迷惑です。

Visual StudioのキューエディターでWADLogsTableを見ると、メッセージレベルが5であることに注意してください(つまり、このETWレベルのリストによると冗長です)。

診断構成ファイルスキーマから離れて、問題#2を解決するための私のアプローチは、一般的なトレースの最小重大度レベル(警告、情報、冗長など)を「情報」(またはより重大)に制限し、自分のログが確実に実行されるようにすることでした。 「verbose」レベルは使用しないでください。

これがdiagnostics.wadcfgxで行った変更です。

オリジナル:

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

修理済み:

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