2

コードと構成:

https://www.windowsazure.com/en-us/develop/net/common-tasks/diagnostics/の公式チュートリアルに従って診断を有効にしました。私の診断初期化子はGlobal.asax(Azure WebRoleに移植されたこのWCFのWebRole.csはありません)から呼び出され、次のように非常に単純です。

public bool Initialize()
{
    DiagnosticMonitorConfiguration config = DiagnosticMonitor.GetDefaultInitialConfiguration();
    config.WindowsEventLog.DataSources.Add("Application!*");
    config.WindowsEventLog.ScheduledTransferPeriod = System.TimeSpan.FromMinutes(1.0);
    DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", config);

    return true;
}

クラウドとローカルの文字列は同じです:

localと構成に同じクラウドベースの診断接続文字列を使用していcloudます。

<?xml version="1.0" encoding="utf-8"?>
<ServiceConfiguration serviceName="MyApp.API.Azure1" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="2" osVersion="*" schemaVersion="2012-05.1.7">
  <Role name="MyApp.API">
    <Instances count="1" />
    <ConfigurationSettings>
      ...
      <Setting name="Microsoft.WindowsAzure.Plugins.Caching.ConfigStoreConnectionString" value="DefaultEndpointsProtocol=https;AccountName=myapi;AccountKey=MyVeryLongStringHereWhichIsActuallyAKeyForAPlaceInTheCloudWhereUnicornsDanceUnderDoubleRainbows" />
    </ConfigurationSettings>
    <Certificates>
      <Certificate name="Microsoft.WindowsAzure.Plugins.RemoteAccess.PasswordEncryption" thumbprint="ThumbPrintStringsAreBiggerThanPinkiePrintString" thumbprintAlgorithm="sha1" />
    </Certificates>
  </Role>
</ServiceConfiguration>

エラー:

Azure Emulator(ローカルコンピューティング)内で上記を実行すると、エラーは発生しません(診断用のクラウド接続文字列にもかかわらず)。AzureでWebロールを実行すると(同じ診断スティングともちろんコードを使用して)、次のエラーが発生します。

    [UnauthorizedAccessException: Access to the path '05d5e525-e1bc-4a37-8bfb-010bb2941301-mswapd-lock' is denied.]
   System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +12895415
   System.Threading.MutexTryCodeHelper.MutexTryCode(Object userData) +229
   System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) +0
   System.Threading.Mutex..ctor(Boolean initiallyOwned, String name, Boolean& createdNew, MutexSecurity mutexSecurity) +629
   System.Threading.Mutex..ctor(Boolean initiallyOwned, String name, Boolean& createdNew) +18
   Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitor.StartDiagnosticsMonitorProcess(DiagnosticMonitorStartupInfo info) +171
   Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitor.ReconfigureMonitoringProcess(ConfigRequest req) +209
   Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitor.UpdateState(DiagnosticMonitorStartupInfo startupInfo) +207
   Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitor.StartWithExplicitConfiguration(DiagnosticMonitorStartupInfo startupInfo, DiagnosticMonitorConfiguration initialConfiguration) +643
   Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitor.Start(CloudStorageAccount storageAccount, DiagnosticMonitorConfiguration initialConfiguration) +47
   Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitor.Start(String diagnosticsStorageAccountConfigurationSettingName, DiagnosticMonitorConfiguration initialConfiguration) +108
   myApp.api.Diag.Diagnostics.Initialize() in c:\Work\MyApp.API\source\Diag\Diagnostics.cs:42
   Global.Application_Start(Object sender, EventArgs e) in c:\Work\MyApp.API\source\Global.asax.cs:30

試み:何も機能しなかった

  • Azure独自の監視/ログメカニズムがストレージアカウントをロックダウンしていた場合に備えて、このストレージアカウントのすべてのAzure監視およびログ(ポータルから)を無効にしました
  • UseDevelopmentStorage=trueローカル構成(ローカルコンピューティング/ Azureエミュレーター)の場合でも、診断のために実際のクラウド接続文字列に置き換えられまし た。
  • 診断初期化子を最小限に簡略化しました(上記を参照)。ただし、DiagnosticMonitor.Start(...)常に失敗します。
  • .cscfgファイルに別の診断接続文字列を作成し(.csdefでも参照)、元Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionStringの文字列がAzureインフラストラクチャでも使用されている場合は、別の文字列を使用できるようにします。ヘルプなし、同じエラー。

これをデバッグしようとして何時間も費やしましたが、Azureでは常にこのエラーが発生します。

質問:

誰かが私がこのエラーを取り除くのを手伝ってもらえますか?私はあなたが持っているかもしれないいくつかのアイデアを試すことができます。私はMSチュートリアルに失望していますが、失望は役に立ちません。

4

2 に答える 2

2

ここでもまったく同じ症状です (ただし、ASP.NET MVC アプリケーションでは)。

基本的に、DiagnosticMonitor.Start() はもう使用しないでください。

以下は私にとってはうまくいきました(Azure SDK 1.8、2012年10月)

この記事の初期化コードを簡略化しました: http://convective.wordpress.com/2010/12/01/configuration-changes-to-windows-azure-diagnostics-in-azure-sdk-v1-3/

    private void ConfigureDiagnostics()
    {
        var wadConnectionString ="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString";

        var cloudStorageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue(wadConnectionString));

        var roleInstanceDiagnosticManager =
                cloudStorageAccount.CreateRoleInstanceDiagnosticManager(
                    RoleEnvironment.DeploymentId,
                    RoleEnvironment.CurrentRoleInstance.Role.Name,
                    RoleEnvironment.CurrentRoleInstance.Id);

        var diagnosticMonitorConfiguration = roleInstanceDiagnosticManager.GetCurrentConfiguration();

        diagnosticMonitorConfiguration.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(1d);

        diagnosticMonitorConfiguration.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1d);

        diagnosticMonitorConfiguration.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
        roleInstanceDiagnosticManager.SetCurrentConfiguration(diagnosticMonitorConfiguration);
    }

Global.asax.cs の Application_Start() から呼び出していますが、現在は正常に動作しています。ローカルでもクラウドでも。

これも web.config で必要です。

  <system.diagnostics>
    <trace>
      <listeners>
        <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          name="AzureDiagnostics">
          <filter type="" />
        </add>
      </listeners>
    </trace>
  </system.diagnostics>

これは ServiceDefinition.csdef の WebRole セクションにあります。

<Imports>
  <Import moduleName="Diagnostics" />
</Imports>

これらは既定でウィザードによって追加されますが、既存のコードを Azure に移行するときに確認する価値があります。

log4net ユーザーへの注意: 特殊なアペンダーは実際には必要ありません。log4net に付属する標準の log4net.Appender.TraceAppender を使用できます。web.config で構成し、通常どおり Application_Start() またはその前に log4net を初期化します。 1回目の使用。

于 2012-12-06T01:02:05.863 に答える
0

トレースリスナー要素からこの行を削除すると、問題が解決しました。

<add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics" />

アプリケーションの起動時に既存のアプリケーション構成を作成せずに、既存のアプリケーション構成を更新する方法を考えていることを知っています。

于 2012-11-07T11:26:58.797 に答える