本文是Windows Azure入门教学的第九篇文章。
本文将会介绍如何使用Windows Azure 诊断功能。跟部署在本地服务器上的程序不同,当我们的程序发布到云端之后,我们不能使用通常的调试方法,例如Remote Debugging等等来对我们的程序进行调试。那么当程序运行出现问题时我们如何能够得知问题的根源以便修正Bug呢?如果我要检测程序的性能,又有什么好的方法呢?
要做到上述的需求,我们需要利用Windows Azure提供的诊断功能,该功能能够记录诊断日志,保存到Windows Azure Storage上。如果要检测程序的性能可以使用性能计数器。该例子不在本文范围内。本文将引导读者建立一个简单的Windows Azure Web Role, 在页面加载时记录一段信息,并从Table Storage中观察收集到的信息。
步骤一:创建解决方案和项目
启动Visual Studio 2010,新建一个Cloud Service项目并为之添加一个Web Role。
步骤二:添加代码
在Default.aspx.cs中添加下列代码:
1
2
3
4
5
6
7
<code>protected void Page_Load(object sender, EventArgs e)</code>
<code>{</code>
<code> </code><code>System.Diagnostics.Trace.WriteLine("Page_Load is called", "Information");</code>
<code>}</code>
在WebRole.cs中添加下列代码:
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<code>public override bool OnStart()</code>
<code> </code><code>// 获取用于Windows Azure诊断的默认初始配置</code>
<code> </code><code>DiagnosticMonitorConfiguration diagConfig = DiagnosticMonitor.GetDefaultInitialConfiguration();</code>
<code> </code><code>diagConfig.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;</code>
<code> </code>
<code> </code><code>// 制定预定传输间隔</code>
<code> </code><code>diagConfig.Logs.ScheduledTransferPeriod = System.TimeSpan.FromMinutes(1);</code>
<code> </code><code>DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", diagConfig);</code>
<code> </code><code>// For information on handling configuration changes</code>
<code> </code><code>return base.OnStart();</code>
步骤三:观察并分析代码
我们需要关心的代码主要有:
· diagConfig.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
该代码设置了日志过滤级别。有些情况下我们只关心严重的错误,这时候我们可以设置过滤级别为LogLevel.Error或者LogLevel.Critical。这样只有符合条件的日志才会被传输到cloud storage上。
· diagConfig.Logs.ScheduledTransferPeriod = System.TimeSpan.FromMinutes(1);
另外需要指出的是,要收集跟踪信息我们需要在Web.config中添加:
<code><</code><code>system.diagnostics</code><code>></code>
<code><</code><code>trace</code><code>></code>
<code> </code><code><</code><code>listeners</code><code>></code>
<code> </code><code><</code><code>add</code> <code>type</code><code>=</code><code>"Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"</code> <code>name</code><code>=</code><code>"AzureDiagnostics"</code><code>></code>
<code> </code><code><</code><code>filter</code> <code>type</code><code>=</code><code>""</code> <code>/></code>
<code> </code><code></</code><code>add</code><code>></code>
<code> </code><code></</code><code>listeners</code><code>></code>
<code></</code><code>trace</code><code>></code>
<code></</code><code>system.diagnostics</code><code>></code>
上面的配置默认的模板已经帮助我们添加了。我们可以观察Web.Config来确认。
步骤四:运行程序
按F5运行程序。页面弹出。这时候代码应该已经执行了。过两分钟左右使用Visual Studio中的Server Explorer窗口,我们可以在Development Storage的WADLogsTable中看到一条记录:

我们可以看到我们在代码中添加的跟踪信息已经被记录到Table Storage中了。实际应用中我们可以通过try-catch来捕获异常,并且添加错误日志。这些日志能够被传送到cloud storage中以便分析问题。
除了一般的日志以外,Windows Azure还提供了其他诊断方式,比如Crash Dump、Windows Event Log、性能计数器等等。