11

我确定我错过了一些简单的东西,但我无法让简单的 Trace.WriteLine 在 Azure 上工作。

我已采取的步骤:

Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString 已设置到我们的 Azure 存储帐户

将模块诊断导入服务定义文件。

Web config

  <system.diagnostics>
    <switches>
      <add name="logLevel" value="4" />
    </switches>
    <trace autoflush="false" indentsize="4">
      <listeners>
        <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          name="AzureDiagnostics">
        </add>
      </listeners>
    </trace>

  </system.diagnostics>

WebRole.cs

public class WebRole : RoleEntryPoint
{
    public override bool OnStart()
    {


        String wadConnectionString = "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString";

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

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

        DiagnosticMonitorConfiguration diagnosticMonitorConfiguration =
            roleInstanceDiagnosticManager.GetCurrentConfiguration();

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

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

        diagnosticMonitorConfiguration.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;

        roleInstanceDiagnosticManager.SetCurrentConfiguration
              (diagnosticMonitorConfiguration);

        Trace.WriteLine("This is the message");
        Debug.Write("This is the debug message");
        System.Diagnostics.Trace.TraceError("message2");
        System.Diagnostics.Trace.TraceWarning("message warning");
        System.Diagnostics.Trace.TraceInformation("message warning");
        Trace.Flush();
        return base.OnStart();

    }
}

解决方案被编译为发行版。

当我查看存储帐户中的对象时,我可以看到一个名为 WADDirectoriesTable 的表以及创建的三个名为 vsdeploy、wad-control-container 和 was-iis-logfiles 的 blob。

没有任何东西看起来像我的 Trace 信息。

非常感谢

4

3 回答 3

4

我有同样的问题。我在这里使用解决方案。我相信您缺少的部分是计划传输日志的位置(在这种情况下,使用 LocalResource 路径):

public override bool OnStart()
{
    Trace.WriteLine("Entering OnStart...");

    var traceResource = RoleEnvironment.GetLocalResource("TraceFiles");
    var config = DiagnosticMonitor.GetDefaultInitialConfiguration();

    // *** this part specifies where transfers should be stored ***
    config.Directories.DataSources.Add(
        new DirectoryConfiguration
        {
            Path = traceResource.RootPath,
            Container = "traces",
            DirectoryQuotaInMB = 100
        });
    config.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(10);

    DiagnosticMonitor.Start("DiagnosticsConnectionString", config);

    return base.OnStart();
}  

为了使其工作,您必须创建一个 LocalStorage 节点来将这些文件存储在您的ServiceDefinition.csdef

<LocalStorage name="TraceFiles" sizeInMB="100" cleanOnRoleRecycle="true" />

并且您需要有一种方法将这些文件传输到可以访问它们的某个地方,因为它们在存储帐户中不可用,而是在 VM 本身的本地资源文件夹中。我通过一个允许我下载本地资源文件的网页来实现这一点。

于 2011-05-13T17:01:32.283 回答
3

对了,整理!

这篇文章解释了一切:http ://social.msdn.microsoft.com/Forums/pl-PL/windowsazuredata/thread/d3f2f1d7-f11e-4840-80f7-f61dc11742fb

这是因为在 Azure SDK 1.3 及更高版本中,webrole.cs 文件中的侦听器与 Web 应用程序的其余部分不同,因为它完全在 IIS 中运行。如果我将跟踪项添加到 Web 应用程序本身,则 WADLogsTable 表会显示我的跟踪信息。

于 2011-05-13T17:16:00.830 回答
2

我自己也有类似的问题,上面的帖子没有回答我。我整理了一篇博文,概述了我为使 Diagnostics 与 SDK 1.6 一起工作所采取的步骤

适用于 WebRoles 的带有 SDK 1.6 的 Windows Azure 诊断

于 2011-12-08T20:38:14.523 回答