Search code examples
azureazure-diagnostics

Clear steps for setting up Azure Diagnostics


I am trying to get diagnostics tracing working, but I am confused about necessary steps I have to follow. I will present what I have done until now:

In app.config I have following:

<system.diagnostics>
    <trace autoflush="true" />

    <sources>
        <source name="ProfileTrace" switchName="profileTraceSwitch" switchType="System.Diagnostics.SourceSwitch">
         <listeners>
                <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics">
                 <filter type="" initializeData="Warning" />
               </add>
               <add name="LogFileListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="..\..\..\skype.portal.profile.log" traceOutputOptions="ProcessId, ThreadId" />
            </listeners>   
        </source>
    </sources>

    <switches>
        <add name="profileTraceSwitch" value="Verbose"/>
    </switches>

</system.diagnostics>

In Service.Definition I have following:

<Imports>
    <Import moduleName="Diagnostics" />
</Imports>

In Service.Configuration I have:

<ConfigurationSettings>
    <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="DefaultEndpointsProtocol=https;AccountName=<snip>;AccountKey=<snip>" />

I have following confusion right now. As you can see in app.config I tried to add a filter for DiagnosticMonitorTraceListener to trace only Warnings, but this filter was ignored. I found this post, which suggests to use custom trace listener that derives from DiagnosticMonitorTraceListener http://social.msdn.microsoft.com/forums/wpapps/en-us/92ed1175-d6b7-4173-a224-0f7eb3e99481/diagnosticmonitortracelistener-ignors-filter

On the other hand in following official link from microsoft http://msdn.microsoft.com/en-us/library/ee758610.aspx they leave filter type empty:

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

Then they mention about configuring Logs property http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.diagnostics.diagnosticmonitorconfiguration.logs.aspx where I see:

public override bool OnStart() {
    ......

    // Filter the logs so that only error-level logs are transferred to persistent storage.
    diagnosticConfiguration.Logs.ScheduledTransferLogLevelFilter = LogLevel.Error;

    ......

    return base.OnStart();
}

}

So, I have following 2 questions:

  1. In my current solution I haven't written any code on Start method of WorkerRole to configure Diagnostic Monitor, but after some searching I found that many people do this. I ran my project locally and I was able to see data stored in Azure WADLogsTable. So, is it mandatory to add Diagnostic Monitor configuration code to my Worker role or can I just have diagnostics.wadcfg?
  2. Since filters for DiagnosticMonitorTraceListener in app.config file are ignored, if I skip the use of a custom trace listener that derives from DiagnosticMonitorTraceListener suggested here http://social.msdn.microsoft.com/forums/wpapps/en-us/92ed1175-d6b7-4173-a224-0f7eb3e99481/diagnosticmonitortracelistener-ignors-filter and use ScheduledTransferLogLevelFilter of Logs property in my WorkerRole, will I achieve the log filter I want? Or maybe filter in app.config and ScheduledTransferLogLevelFilter refer to 2 different kind of filters?

Solution

  • I would recommend against setting the Azure diagnostic configuration in code. Instead, I would recommend using the diagnostic.wadcfg file approach. You can find some info here - http://msdn.microsoft.com/en-us/library/hh411551.aspx. Visual Studio will help generate this file as well.

    It is not mandatory to set any Azure diagnostic configuration in your role's OnStart() method.

    Setting the ScheduledTransferLogLevelFilter should suffice. Plus, that also enables you to easily change the filter level at runtime if needed (via an API call, Visual Studio, or 3rd party tool like Cerebrata Azure Management Studio).