1

我有一个带有以下代码的 Azure WebRole:

public override bool OnStart()
{
    setDiagnostics();

    TestClass test = new TestClass();

    return base.OnStart(); 
}

private void setDiagnostics()
{
    string wadConnectionString = "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString";
    CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue(wadConnectionString));

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

    DiagnosticMonitorConfiguration diagConfig = roleInstanceDiagnosticManager.GetCurrentConfiguration();

    if (diagConfig == null)
        diagConfig = DiagnosticMonitor.GetDefaultInitialConfiguration();

    diagConfig.WindowsEventLog.DataSources.Add("Application!*");
    diagConfig.WindowsEventLog.ScheduledTransferPeriod = TimeSpan.FromMinutes(1D);

    roleInstanceDiagnosticManager.SetCurrentConfiguration(diagConfig);

    DiagnosticMonitor.Start(wadConnectionString, diagConfig);
}

在 my 的构造函数中TestClass是以下代码:

EventLog.WriteEntry("TestClass", "Before the try", EventLogEntryType.Information);
try
{
    EventLog.WriteEntry("TestClass", "In the try", EventLogEntryType.Information);
    Int32.Parse("abc");
}
catch (Exception ex)
{
    EventLog.WriteEntry("TestClass", ex.Message, EventLogEntryType.Error);
}

OnStart出于某种原因,如果我在调试模式下运行它并在方法上设置一个断点并使用F11. 但是,如果我删除所有断点并运行它,我不会在我的WADWindowsEventLogsTable中看到任何 EventLog 条目。所以这对我来说似乎是一个时间问题......有谁知道我的代码为什么会执行这种行为?

提前致谢!

4

4 回答 4

2

问题在于EventLog.WriteEntry()方法。我使用源“TestClass”作为 EventLog 源。但是,我从未使用启动任务创建此源,并且由于权限不足,它无法记录我的条目。

所以解决方案:使用启动任务创建自己的源或使用跟踪消息。

于 2012-06-06T10:31:56.470 回答
0

尝试将您的TestClass创作RoleEntryPoint.OnStart()RoleEntryPoint.Run().

public override void Run() {
  TestClass test = new TestClass();
  base.Run();
}
于 2012-05-24T20:12:08.130 回答
0

将其部署到 Azure 时,该角色是否实际启动,还是只是在初始化和忙碌之间循环?

如果确实如此,则问题与时间有关。项目会定时从实例传输到 Azure 存储:

diagConfig.WindowsEventLog.ScheduledTransferPeriod = TimeSpan.FromMinutes(1D);

如果实例在达到该计时器之前重新启动,则不会将任何内容传输到您的表中。

于 2012-05-24T21:01:33.360 回答
0
  1. 您需要确保让应用程序运行超过 1 分钟。
  2. 您需要验证以下设置是否已关闭(这可能会导致日志最终位于与您预期不同的位置,更多信息: http: //michaelcollier.wordpress.com/2012/04/ 02/where-is-my-windows-azure-diagnostics-data/):

在此处输入图像描述

于 2012-05-25T10:37:44.260 回答