Azure诊断:拒绝访问路径'(GUID)-mswapd-lock'?

时间:2012-09-10 18:59:40

标签: connection-string azure-diagnostics

代码和配置:

我已根据https://www.windowsazure.com/en-us/develop/net/common-tasks/diagnostics/的官方教程启用了诊断功能。我的诊断初始化程序是从Global.asax调用的(没有WebRole.cs用于此WCF移植到Azure WebRole),它非常简单,如:

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;
}

云和本地字符串相同:

我正在为localcloud配置使用基于SAME云的诊断连接字符串。

<?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模拟器(本地计算)中运行上述内容时,我没有收到错误(尽管有用于诊断的云连接字符串)。当我在Azure上运行webrole时(使用相同的诊断标记,当然还有代码),我收到以下错误:

    [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中引用),这样如果Azure基础结构也使用原始Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString,我还有另一个字符串。没有帮助,同样的错误。

我已经花了很多时间尝试调试这个,但我总是在Azure上出现此错误。

问题:

有人可以帮我摆脱这个错误吗?我可以尝试一些你可能有的想法。我对MS教程很失望,但失望并没有帮助。

2 个答案:

答案 0 :(得分: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用户的注释: 专用的appender并不是必需的,你可以使用log4net附带的标准log4net.Appender.TraceAppender - 只需在你的web.config和init log4net中像往常一样在Application_Start()或第一次使用之前配置它。 p>

答案 1 :(得分:0)

从跟踪侦听器元素中删除此行为我解决了问题。

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

知道我正在考虑如何更新现有的应用程序配置,而不是在应用程序启动期间创建一个。