2014-07-22 2 views
1

Azure 진단 모니터에서 다음과 같은 문제가 발생했습니다. WorkerRole 진입 점에서 OnStart() 이벤트에서 새 AppDomain을 만들면 진단은 상위 AppDomain에서만 작동합니다. 자식 AppDomain에서 진단 모니터 초기화를 시도했지만 도움이되지 않습니다.Azure 진단 다중 AppDomain 문제

public class WorkerRole : RoleEntryPoint 
{ 
    public override void Run() 
    { 
     // This is a sample worker implementation. Replace with your logic. 
     InitializeDiagnostics(); 
     Trace.TraceInformation("WorkerRole1 entry point called", "Information"); 

     while (true) 
     { 
      Thread.Sleep(10000); 
      Trace.TraceInformation("Parent domain working", "Information"); 
     } 
    } 

    public override bool OnStart() 
    { 
     // Set the maximum number of concurrent connections 
     ServicePointManager.DefaultConnectionLimit = 12; 
     InitializeDiagnostics(); 

     var setup = new AppDomainSetup(); 
     setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; 
     setup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; 
     var newDomain = System.AppDomain.CreateDomain("NewApplicationDomain",null, setup); 
     foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies().Where(x => !x.GlobalAssemblyCache)) 
     { 
      newDomain.Load(assembly.GetName()); 
     } 
     newDomain.Load(typeof (Worker).Assembly.FullName); 
     var worker = newDomain.CreateInstanceAndUnwrap(this.GetType().Assembly.FullName, typeof (Worker).FullName) as Worker; 
     worker.DoWork(); 


     return base.OnStart(); 
    } 

    public void InitializeDiagnostics() 
    { 
     var roleInstanceDiagnosticManager = new RoleInstanceDiagnosticManager(RoleEnvironment.GetConfigurationSettingValue("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"), 
                       RoleEnvironment.DeploymentId, 
                       RoleEnvironment.CurrentRoleInstance 
                          .Role.Name, 
                       RoleEnvironment.CurrentRoleInstance.Id); 
     var dmc = roleInstanceDiagnosticManager.GetCurrentConfiguration(); 

     var dictionaryConfiguration = new DirectoryConfiguration(); 
     DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", dmc); 
    } 
} 

public class Worker : MarshalByRefObject 
{ 
    public void DoWork() 
    { 


     new Task(() => 
      { 
       while (true) 
       { 
        Thread.Sleep(1000); 
        Trace.TraceInformation(AppDomain.CurrentDomain.FriendlyName + " Worker working...", "Information"); 
       } 

      }).Start(); 
    } 
} 

}

애플리케이션 구성 :

<?xml version="1.0" encoding="utf-8" ?> 
    <configuration> 
    <system.diagnostics> 
    <trace> 
      <listeners> 
      <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
       name="AzureDiagnostics"> 
       <filter type="" /> 
      </add> 
      </listeners> 
     </trace> 
    </system.diagnostics> 
</configuration> 

예상 출력 : 로깅 메시지 많이 :

예 생식 코드 (트레이스 부모 도메인으로부터 만 수집) "{Domain Name} Wokrer working ..." 일부 "상위 도메인 작동 중"

실제 출력 : 나는 푸른 SDK 2.0을 사용하고

"작업 부모 도메인". 비슷한 문제가 생겼습니까?

답변

0

좋아, 마침내 해결되었습니다. Azure SDK를 2.3으로 업그레이드 한 이유는 ... 메시지가 여전히 Compute 에뮬레이터 콘솔에는 나타나지 않지만 업그레이드 후에는 올바르게 WADLog 테이블에 기록된다는 것은 흥미 롭습니다.