2012-05-24 4 views
1

У меня есть Azure WebRole со следующим кодом:WindowsEventLogs не авторизованы на Azure

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

В конструкторе моего 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. Тем не менее, я не вижу записей EventLog в своем WADWindowsEventLogsTable, если я удалю все точки останова и просто запустил его. Поэтому мне кажется, что это вопрос времени ... Кто-нибудь знает, почему мой код выполняет это поведение?

Заранее благодарен!

+0

Я пробовал точно такой же код, и он действительно работал. Если бы у вас было исключение, зарегистрированное в MonAgent.exe, это может привести к тому, что журналы не будут выгружены. – AvkashChauhan

ответ

2

Проблема была в методе EventLog.WriteEntry(). Я использовал источник TestClass в качестве источника EventLog. Однако я никогда не создавал этот источник с помощью задачи запуска, и из-за недостаточных прав он не смог зарегистрировать мои записи.

Таким образом, решение: создать собственный источник с помощью задачи запуска или использовать сообщения трассировки.

0

Когда оно развернуто до Azure, действительно ли роль запускается или выполняется только между инициализацией и занятостью?

Если проблема связана с временем. Элементы передаются от экземпляра к Azure Storage на приуроченной основе:

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

если экземпляр перезапускается, прежде чем она попадет, что таймер, то ничего не будет передано в вашу таблицу.

0
  1. Вам необходимо убедиться, что приложение держится более 1 минуты.
  2. Вам нужно проверить, что следующий параметр выключен (это может привести к журналам оказаться в другом месте, чем можно было бы ожидать от них, больше информации: http://michaelcollier.wordpress.com/2012/04/02/where-is-my-windows-azure-diagnostics-data/):

enter image description here