SharePoint 2010 中的调试和日志记录功能

**摘要:**了解 SharePoint Foundation 2010 中的新的日志记录和调试功能,开发人员可利用这些功能构建更可靠且可测试的解决方案。

上次修改时间: 2011年1月12日

适用范围: Business Connectivity Services | Office 2010 | Open XML | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio

本文内容
SharePoint 2010 中的调试和日志记录简介
SharePoint 2010 中的日志记录
SharePoint 2010 中的错误报告
自定义 SharePoint 应用程序页
SharePoint 2010 开发人员仪表板
结论
其他资源

目录

  • SharePoint 2010 中的调试和日志记录简介

  • SharePoint 2010 中的日志记录

  • SharePoint 2010 中的错误报告

  • 自定义 SharePoint 应用程序页

  • SharePoint 2010 开发人员仪表板

  • 结论

  • 其他资源

单击以获取代码   下载代码(该链接可能指向英文页面)

SharePoint 2010 中的调试和日志记录简介

Microsoft SharePoint 2010 是一个扩展性非常好的产品,开发人员可对其自定义以满足各种业务需求。由于 SharePoint 是基于 Microsoft ASP.NET 的,因此它为开发人员提供了可用于传统 ASP.NET 网站的同一调试和日志记录功能。除 ASP.NET 提供的功能之外,SharePoint 2010 还引入了其他选项以帮助开发人员在调试和日志记录方面监视应用程序并进行故障排除。

本文介绍了开发人员可在其自定义 SharePoint 2010 应用程序中使用的各种调试和日志记录点和技术。

SharePoint 2010 中的新的日志记录和调试功能

最佳应用程序包含合理的日志记录度量,以帮助开发人员在情况未按预期发展或发生意外情况时跟踪错误。Microsoft Office SharePoint Server 2007 为开发人员提供了 ASP.NET 中可用的所有工具,如调试和跟踪日志。开发人员也可对 SharePoint 日志(称为统一日志记录服务 (ULS))进行写入操作,但直接写入日志文件需要执行其他一些操作。

Microsoft 在 SharePoint 2010 中添加了更多的日志记录和调试功能,以帮助开发人员将额外的监视和故障排除功能包含在自定义应用程序中。本文介绍了 SharePoint 2010 中的以下几个新方面:

  • 相关令牌

  • 日志记录数据库

  • 自定义错误页

  • 开发人员仪表板

SharePoint 2010 中的日志记录

每台运行 Windows SharePoint Services 3.0 和 Office SharePoint Server 2007 的服务器都会将日志记录信息写入 ULS 日志文件和服务器事件日志。在服务器场中每台运行 SharePoint 的服务器上的 {SharePoint Root}\LOGS 文件夹中找到的 ULS 日志文件可包含相当多的信息,具体取决于诊断日志限制的配置情况。尽管通常情况下日志记录越详细越好,但在日志文件中查找特定项可能会有一定难度。通过为每个日志项分配唯一性,SharePoint 2010 提高了查找特定日志项的效率。此唯一性(称为相关令牌)是一个在出现错误时提供给用户的 GUID。管理员或开发人员随后可在错误中提取此 GUID 字符串,并使用它在日志文件中搜索特定项。这将加快在日志文件中查找项的速度以便跟踪特定事件。

此外,可以配置 ULS 以根据特定条件确定日志文件和事件日志中包含的详细信息数。配置诊断日志记录 (SharePoint Foundation 2010) (Microsoft TechNet) 一文演示了如何在 SharePoint 2010 中配置诊断日志记录。

SharePoint 日志记录数据库

Microsoft 引入的另一个更改是一个新数据库,该数据库包含服务器场中的所有服务器的所有日志记录信息。通过使用几个新的计时器作业即可做到这一点。在启用这些作业(默认情况下它们处于禁用状态)后,SharePoint 会将诊断日志记录数据插入新的 Microsoft SQL Server 数据库。以下是新的计时器作业:

  • 诊断数据提供程序: 事件日志

  • 诊断数据提供程序: 性能计数器 - 数据库服务器

  • 诊断数据提供程序: 性能计数器 - Web 前端

  • 诊断数据提供程序: SQL 组合查询

  • 诊断数据提供程序: SQL DMV

  • 诊断数据提供程序: SQL 内存 DMV

  • 诊断数据提供程序: 跟踪日志

计时器作业参考 (SharePoint Server 2010)(该链接可能指向英文页面) 中记录了这些计时器作业的详细信息。启用这些作业获得的最大好处之一是,各种日志文件都聚合到一个可从各个源查询的位置。甚至可以使用 Microsoft Business Connectivity Services (BCS) 外部内容类型和列表公开此日志记录数据库的内容。

读取 SharePoint ULS 日志

除 SharePoint 2010 中的新日志记录数据库之外,开发人员还可以分析在每台服务器上的 {SharePoint Root}\LOGS 文件夹中创建的原始 SharePoint 日志文件。在开发解决方案时,开发人员通常会在隔离的环境中工作,在此环境中,所有程序都会安装在单个服务器上,而不是安装在包含各种服务器的服务器场上。日志文件只是一些具有固定宽度且带分隔符的大型文本文件,可使用任何文本编辑器读取和搜索它们。

除搜索原始文本文件之外,很多开发人员还发布了各种实用程序,这些程序可帮助读取 SharePoint 日志文件。SharePoint ULS 查看器(该链接可能指向英文页面)的快速搜索会生成大量资源。这些实用程序的一部分程序中包含通知和方法,与使用标准文本编辑器相比,利用这些方法可更轻松地按特定条件进行搜索和筛选。

写入 SharePoint ULS 日志

在对 SharePoint 生成的消息进行疑难解答时,从 SharePoint ULS 日志读取会很有用。但开发人员真正需要的是,能够将自己的消息写入日志文件。Microsoft 通过使用 SPDiagnosticsService 类使对 SharePoint 2010 中的日志文件进行写入变得更加容易,如下面的示例所示。

try{
  ...
} catch (Exception ex) {
  SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("MSDN", TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, ex.Message, ex.StackTrace);
}

上面的代码段可将异常详细信息写入 SharePoint ULS 日志。在检查添加的项目后,开发人员将发现"产品"列的项目为"未知"。这是 SPDiagnosticsService 类的默认行为。若要添加自定义产品名,开发人员可使用 SPDiagnosticsServiceBase 类来实施其诊断服务。遗憾的是,与自定义 SPDiagnosticsService 的交互仅在完全信任服务器场解决方案中而非沙盒解决方案中可用。若要使用 SPDiagnosticsService 类从沙盒写入 ULS 日志,开发人员可以创建沙盒解决方案可调入的完全信任代理。下面两节将介绍如何写入 SharePoint ULS 日志。

除写入自定义 SPDiagnosticsService 类之外,Microsoft 模式和做法 组还发布了针对 SharePoint 2010 开发应用程序(该链接可能指向英文页面)指导包,其中包括一个 SharePoint 记录器。开发人员在构建自定义应用程序时应考虑所有这些方法。

创建自定义日志记录服务

在自定义应用程序中创建自定义日志记录服务包括创建 SPDiagnosticsServiceBase 类的新实现、覆盖单个方法以及提供几个用于写入日志文件的方法。

以下示例演示如何向非沙盒解决方案添加一个新类并使该类从 SPDiagnosticsServiceBase 类继承。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.Administration;

namespace MSDN.SharePoint.Samples.WriteToUls {
  public class LoggingService : SPDiagnosticsServiceBase { 
    private LoggingService() : 
      base("MSDN Logging Service", SPFarm.Local) { }
  }
}

然后,实现用于注册可用产品名和日志记录类别的 ProvideAreas 方法,如以下示例所示。

public const string MSDN_INFO = "MSDN Info";
public const string MSDN_ERROR = "MSDN Error";
private static string PRODUCT_DIAGNOSTIC_NAME = "MSDN Sample";

protected override IEnumerable<SPDiagnosticsArea> ProvideAreas() {
  List<SPDiagnosticsArea> areas = new List<SPDiagnosticsArea>{
    new SPDiagnosticsArea(PRODUCT_DIAGNOSTIC_NAME, new List<SPDiagnosticsCategory>{
      new SPDiagnosticsCategory(MSDN_INFO, TraceSeverity.Verbose, EventSeverity.Information),
      new SPDiagnosticsCategory(MSDN_ERROR, TraceSeverity.Unexpected, EventSeverity.Warning),
    })
  };

  return areas;
}

以下示例演示了最后一个步骤,该步骤通过添加几个可从自定义组件(如 Web 部件)调用的静态方法,使自定义日志记录服务变得易于使用。

private static LoggingService _current;
public static LoggingService Current {
  get {
    if (_current == null)
      _current = new LoggingService();
    return _current;
  }
}

public static void LogMessage(string categoryName, string message) {
  SPDiagnosticsCategory category = 
  LoggingService.Current.Areas[PRODUCT_DIAGNOSTIC_NAME].Categories[categoryName];
  LoggingService.Current.WriteTrace(0, category, TraceSeverity.Verbose, message);
}

public static void LogError(string categoryName, string message) {
  SPDiagnosticsCategory category = 
  LoggingService.Current.Areas[PRODUCT_DIAGNOSTIC_NAME].Categories[categoryName];
  LoggingService.Current.WriteTrace(0, category, TraceSeverity.Unexpected, message);
}

通过向项目添加自定义组件(如 Web 部件)测试记录器并调用日志记录服务,如以下示例所示。

public class WriteToUlsFarmSolutionWebPart : WebPart {
  protected override void CreateChildControls() {
    Button logInfoButton = new Button { Text = "log info entry" };
    logInfoButton.Click += (sender, e) => 
      LoggingService.LogMessage(LoggingService.MSDN_INFO, "Sample info message.");
    this.Controls.Add(logInfoButton);

    Button logErrorButton = new Button { Text = "log error entry" };
    logErrorButton.Click += (sender, e) =>
      LoggingService.LogMessage(LoggingService.MSDN_ERROR, "Sample error message.");
    this.Controls.Add(logErrorButton);
  }
}

在通过单击 Web 部件中的某个按钮运行前面的代码时,将使用产品名 MSDN Sample 和某个新类别向 SharePoint 日志文件添加新项。

从沙盒解决方案写入 ULS 日志

遗憾的是,无法直接从沙盒解决方案中写入 ULS 日志。这是因为沙盒解决方案无权从独立的用户代码服务访问日志记录服务。但是,开发人员可以创建部署为服务器场解决方案的完全信任代理,这样任何沙盒解决方案都可以利用此完全信任代理。有关创建完全信任代理的详细演练,请参阅How To: Create and Register a Sandbox Proxy

使用 Microsoft Visual Studio 2010 中的 SharePoint 开发工具创建服务器场解决方案,并创建之前创建过的同一 SPDiagnosticsServiceBase 日志记录类。下一个步骤是,创建将调用日志记录服务的代理。

向将采用代理操作参数的项目添加另一个类,如以下示例所示。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.UserCode;

namespace MSDN.SharePoint.Samples.WriteToUls {
  [Serializable]
  public class LoggingMessageProxyArguments : SPProxyOperationArgs {
    public string MessageCategoryName { get; set; }
    public string MessageContents { get; set; }

    public static string LoggingProxyOperationTypeName {
      get {
        return "LoggingProxy.LoggingMessageProxyOperation";
      }
    }

    public static string LoggingProxyAssemblyName {
      get {
        return "MSDN.SharePoint.Samples.WriteToUlsSandboxSolution.Proxy, Version=1.0.0.0, Culture=neutral, PublicKeyToken=[INSERT PROJECT'S PUBLICKEYTOKEN HERE]";
      }
    }
  }
}

然后,向执行完全信任操作的项目添加另一个类,如以下示例所示。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.UserCode;

namespace MSDN.SharePoint.Samples.WriteToUls {
  public class LoggingMessageProxyOperation : SPProxyOperation {
    public override object Execute(SPProxyOperationArgs args) {
      LoggingMessageProxyArguments proxyArguments = args as LoggingMessageProxyArguments;

      string loggingCategory ;
      switch (proxyArguments.MessageCategoryName.ToLower()) {
        case LoggingService.MSDN_ERROR:
          loggingCategory = LoggingService.MSDN_ERROR;
          break;
        default:
          loggingCategory = LoggingService.MSDN_INFO;
          break;
      }

      // Do full trust action.
      LoggingService.LogMessage(loggingCategory, proxyArguments.MessageContents);
    }
  }
}

创建代理的参数和操作后,最后一个步骤是,将该代理注册到服务器场中的用户代码服务。可通过使用服务器场范围的功能中的已激活事件来完成此操作,如以下示例所示。

public class LoggingMessageProxyInstallerEventReceiver : SPFeatureReceiver {
  public override void FeatureActivated(SPFeatureReceiverProperties properties) {
    // Get proxy operation.
    LoggingMessageProxyOperation proxyOperation = new SPProxyOperationType(
                                LoggingMessageProxyArguments.LoggingProxyAssemblyName,
                                LoggingMessageProxyArguments.LoggingProxyOperationTypeName);

    SPUserCodeService ucService = SPUserCodeService.Local;
    ucService.ProxyOperationTypes.Add(proxyOperation);
    ucService.Update();
  }

  public override void FeatureDeactivating(SPFeatureReceiverProperties properties) {
    // Get proxy operation.
    LoggingMessageProxyOperation proxyOperation = new SPProxyOperationType(
                                LoggingMessageProxyArguments.LoggingProxyAssemblyName,
                                LoggingMessageProxyArguments.LoggingProxyOperationTypeName);

    // Add proxy to user code service.
    SPUserCodeService ucService = SPUserCodeService.Local;
    ucService.ProxyOperationTypes.Remove(proxyOperation);
    ucService.Update();
  }
}

在部署此项目并激活包含的服务器场范围的功能后,可从沙盒解决方案中调用该代理。下面的代码演示沙盒解决方案中部署的 Web 部件如何使用完全信任代理和写入 SharePoint 2010 ULS 日志。

public class WriteToUlsSandboxSolutionWebPart : WebPart {
  protected override void CreateChildControls() {
    LoggingMessageProxyArguments loggingProxyArgs = new LoggingMessageProxyArguments();

    Button logInfoButton = new Button { Text = "log info entry" };
    logInfoButton.Click += (sender, e) => {
      loggingProxyArgs.MessageCategoryName = LoggingService.MSDN_INFO;
      loggingProxyArgs.MessageContents = "Sample info message";
      var result1 = SPUtility.ExecuteRegisteredProxyOperation(
        LoggingMessageProxyArguments.LoggingProxyAssemblyName,
        LoggingMessageProxyArguments.LoggingProxyOperationTypeName,
        loggingProxyArgs);
    };
    this.Controls.Add(logInfoButton);

    Button logErrorButton = new Button { Text = "log error entry" };
    logInfoButton.Click += (sender, e) => {
      loggingProxyArgs.MessageCategoryName = LoggingService.MSDN_ERROR;
      loggingProxyArgs.MessageContents = "Sample info message";
      var result2 = SPUtility.ExecuteRegisteredProxyOperation(
        LoggingMessageProxyArguments.LoggingProxyAssemblyName,
        LoggingMessageProxyArguments.LoggingProxyOperationTypeName,
        loggingProxyArgs);
    };
    this.Controls.Add(logErrorButton);
  }
}

有关将日志记录事件和跟踪事件写入 ULS 日志的指南,请参阅 SharePoint 2010 SDK 中的跟踪和事件日志安全级别

SharePoint 2010 中的错误报告

对于开发人员而言,向自定义项目中添加大量日志记录是一个不错的做法,因为这将有助于在问题出现时进行跟踪。但是,总是会存在以下情况:仍会出现需要开发人员进行跟踪的错误。此外,开发人员可能需要更改 SharePoint 2010 使用的某些默认系统页。以下各节介绍了这两种方案。

使用 Web 应用程序 web.config 文件

当 ASP.NET 应用程序中出现错误时,系统会将这些错误显示为其原始状态(如果 web.config 文件包含元素 <customErrors mode="Off" />),或者使用自定义错误页来隐藏错误的详细信息并显示自定义消息(如果 web.config 文件包含元素 <customErrors mode="On" />)。

SharePoint 2010 中的默认配置用于打开自定义错误,而不显示该错误的详细信息。这样做的一个原因是,使用户不会看到不友好的错误,而是为用户呈现更美观的错误页。不包含完整详细信息的另一个原因是,提供错误的完整详细信息可被视为安全缺陷,因为这可能会公开更多不应向用户公开的信息。

遗憾的是,SharePoint 传递的自定义错误消息有时会不够详细,从而导致开发人员无法解决问题。在构建自定义解决方案时,查看完整的错误(包括特定异常、异常消息和完整的调用堆栈)将很有用。可通过修改 Web 应用程序的 web.config 文件并将 <customErrors /> 元素中的模式更改为 Off 来轻松实现这一点。这将显示整个 Web 应用程序的原始 ASP.NET 错误页。通过使用一个 Web 应用程序范围的功能并实现该功能的已激活和已禁用事件来进行此更改,也可以自动执行此过程,如以下示例所示。

public override void FeatureActivated(SPFeatureReceiverProperties properties) {
  SPWebApplication WebApp = (SPWebApplication)properties.Feature.Parent;
  foreach (ModificationEntry modEntry in Entries) {
    WebApp.WebConfigModifications.Add(
      CreateModification(modEntry)
    );
  }
  WebApp.WebService.ApplyWebConfigModifications();
}

public override void FeatureDeactivating(SPFeatureReceiverProperties properties) {
  SPWebApplication WebApp = (SPWebApplication)properties.Feature.Parent;
  foreach (ModificationEntry modEntry in Entries) {
    WebApp.WebConfigModifications.Remove(
      CreateModification(modEntry)
    );
  }
  WebApp.WebService.ApplyWebConfigModifications();
}

private struct ModificationEntry {
  public string Name;
  public string XPath;
  public string Value;
  public SPWebConfigModification.SPWebConfigModificationType ModType;
  // Parameterized contructor.
  public ModificationEntry(
      string Name, string XPath, string Value,
      SPWebConfigModification.SPWebConfigModificationType ModType) {
    // Intialize structure instances.
    this.Name = Name;
    this.XPath = XPath;
    this.Value = Value;
    this.ModType = ModType;
  }
}

private ModificationEntry[] Entries = {
  new ModificationEntry( 
    "mode", "configuration/system.web/customErrors", "Off", 
    SPWebConfigModification.SPWebConfigModificationType.EnsureAttribute)
 };

private SPWebConfigModification CreateModification(ModificationEntry modEntry) {
  // Create and return SPWebConfigModification object.
  SPWebConfigModification modification;
  modification = new SPWebConfigModification(modEntry.Name, modEntry.XPath);
  modification.Owner = "MSDN.SharePointDebugger";
  modification.Sequence = 0;
  modification.Type = modEntry.ModType;
  modification.Value = modEntry.Value;
  return modification;
}

使用布局 web.config 文件

您应记住,Web 应用程序中的文件夹将继承其父文件夹中的 web.config 文件设置,除非它们被本地 web.config 文件覆盖。对于 SharePoint 2010,http://.../_layouts 文件夹包含其自己的已打开自定义错误的 web.config 文件。因此,在创建自定义应用程序页或对 SharePoint 2010 应用程序页进行故障排除时,开发人员可能需要修改位于 {SharePoint Root}\TEMPLATE\LAYOUTS 文件夹中的 web.config,或添加用于关闭文件夹(包含自定义应用程序页)中的自定义错误的自定义 web.config。

自定义 SharePoint 应用程序页

SharePoint 2010 包括大量针对报告错误、访问被拒绝通知以及登录和注销页等内容的系统应用程序页。在早期版本的 SharePoint 中,这些文件都是硬编码的。尽管可以轻松更改某些内容(例如,可在 web.config 文件中更改的登录页),但如果没有创新的代码,则无法更改其他内容。

Microsoft 通过为开发人员提供了检索自定义页的 URL 的方法,并使开发人员能够创建自己的系统应用程序页,从而在 SharePoint 2010 中改进了这一点。这使开发人员能够创建自定义系统应用程序页,这些页包含自定义业务逻辑,或者可以进行品牌打造以配合其他的网站品牌打造。可通过两种方法将这些更改应用于 Web 应用程序:GetMappedPage 和 UpdateMappedPage。可在 SPWebApplication.SPCustomPage 枚举中找到可更改的可用系统应用程序页的列表。

最好是在 Web 应用程序范围的功能的已激活或已禁用事件中更改系统母版页。首先,创建一个可充当自定义系统应用程序页的新应用程序页。然后,创建一个 Web 应用程序范围的功能并实现已激活或已禁用事件,如以下示例所示。

public class CustomErrorPagesEventReceiver : SPFeatureReceiver {
  public override void FeatureActivated(SPFeatureReceiverProperties properties)
  {
    SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;
    if (webApp != null) {
      // Set Access Denied.
      if (!webApp.UpdateMappedPage(SPWebApplication.SPCustomPage.AccessDenied, 
          "/_layouts/CustomErrorPages/AccessDenied.aspx")) {
        throw new ApplicationException("Failed setting new access denied page mapping.");
      }

      // Set Signout.
      if (!webApp.UpdateMappedPage(SPWebApplication.SPCustomPage.Signout, 
          "/_layouts/CustomErrorPages/Signout.aspx")) {
        throw new ApplicationException("Failed setting new signout page mapping.");
      }

      // Set File Not Found.
      webApp.FileNotFoundPage = "/_layouts/1033/FileNotFound.htm";

      webApp.Update(true);
    }
  }

  public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
  {
    SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;
    if (webApp != null) {
      webApp.UpdateMappedPage(SPWebApplication.SPCustomPage.AccessDenied, null);
      webApp.UpdateMappedPage(SPWebApplication.SPCustomPage.Signout, null);
        webApp.FileNotFoundPage = null;
    }
  }
}

SharePoint 2010 开发人员仪表板

"开发人员仪表板"是 SharePoint 2010 中新增的一项功能,用于帮助开发人员记录并调试添加到 SharePoint 页的自定义组件。可为整个服务器场启用开发人员仪表板,以便为特定页请求的活动和性能拍摄快照。

图 1. 开发人员仪表板

开发人员仪表板

开发人员仪表板在对页面上的有问题的组件进行故障排除时很有用,因为一个 SharePoint 页可包含多个自定义组件。当一个页面包含多个自定义组件且页面的性能低于所需性能时,除非使用简单的排除过程,否则难以隔离直接导致性能较低的组件。开发人员仪表板正好可为这样的方案提供帮助。

开发人员仪表板包含几类不同的信息。它提供有关以下各项的详细信息:处理线程的时间、SQL Server 数据库调用和 Windows Communication Foundation (WCF) 服务调用的数量和执行持续时间、URL、当前用户等。

配置开发人员仪表板

默认情况下,开发人员仪表板并未启用。可通过 API 或使用自定义 Windows PowerShell 脚本启用开发人员仪表板,如以下示例所示。

$contentService = [Microsoft.SharePoint.Administration.SPWebService]::ContentService
$dashboardSetting = $contentService.DeveloperDashboardSettings
$dashboardSetting.DisplayLevel = [Microsoft.SharePoint.Administration.SPDeveloperDashboardLevel]::On
$dashboardSetting.Update()

开发人员仪表板提供了两个不同的显示级别。"SPDeveloperDashboardLevel.On"枚举选项可在服务器场中的所有页面上启用仪表板。如果将它设置为"SPDeveloperDashboardLevel.OnDemand",则会将开发人员仪表板保持禁用状态,但会将一个类似于性能计数器的图像添加到页面的右上角。在单击此图像时,将触发回发,这会将开发人员仪表板添加到页面。

有关开发人员仪表板的信息,请参阅 SharePoint 2010 SDK 中的使用开发人员仪表板

虽然开发人员仪表板包含 SharePoint 进程的大量信息,开发人员还是可以将自己的日志记录添加到仪表板中显示的自定义组件中。

写入开发人员仪表板

只能直接从服务器场解决方案执行对开发人员仪表板的写入操作;沙盒解决方案无法写入开发人员仪表板,因为它们在用户代码进程中被隔离。若要写入开发人员仪表板,则应将自定义组件包含在 SPMonitoredScope 对象中。

下面的代码演示如何写入开发人员仪表板以及如何创建嵌套范围。

public class MonitoredWebPart : WebPart {
  protected override void CreateChildControls() {
    using (SPMonitoredScope scope = new SPMonitoredScope("MonitoredWebPart.CreateChildControls")) {
      this.Controls.Add(
        new LiteralControl("Turn on the developer dashboard to see entries logged by this Web Part.");

        // Trigger a SPRequest & DB round trip.
        TriggerSpDatabaseRequest();
        TriggerSPRequestObject();

        // Simulate a delay.
        TriggerSimulatedDelay();
      );
    }
  }
  private void TriggerSpDatabaseRequest() {
    using (SPMonitoredScope scope = new SPMonitoredScope("MonitoredWebPart.TriggerSpDatabaseRequest")) {
      SPList someList = SPContext.Current.Web.Lists[0];
      int itemsinList = someList.Items.Count();
    }
  }

  private void TriggerSPRequestObject() {
    using (SPMonitoredScope scope = new SPMonitoredScope("MonitoredWebPart.TriggerSPRequestObject")) {
      using (SPSite siteCollection = new SPSite(SPContext.Current.Site.Id)) {
        string siteCollectionUrl = siteCollection.RootWeb.Url;
      }
    }
  }

  private void TriggerSimulatedDelay() {
    using (SPMonitoredScope scope = new SPMonitoredScope("MonitoredWebPart.TriggerSimulatedDelay")) {
      System.Threading.Thread.Sleep(2000);
    }
  }
}

图 2 演示了向页面添加上一个代码示例中显示的 Web 部件所获得的结果。

图 2. 写入开发人员仪表板

写入开发人员仪表板

向自定义母版页添加开发人员仪表板

开发人员仪表板包含在所有使用 SharePoint 2010 中包含的母版页之一的 SharePoint 网站中。在创建自定义母版页时,开发人员可通过添加以下服务器控件(最好添加到页面底部)来添加开发人员仪表板:

<SharePoint:DeveloperDashboard runat="server" />

当开发人员仪表板设置为 SPDeveloperDashboardLevel.OnDemand 时,它会使用仪表板启动器来显示图标并呈现仪表板。开发人员还需要向自定义母版页添加以下控件:

<SharePoint:DeveloperDashboardLauncher runat="server" />

此控件包含几个公共属性,用于更改用来呈现控件的放置、文本和图像。可在 SharePoint 2010 SDK 中的 DeveloperDashboardLauncher 类中找到它们。

结论

在最新版本的 SharePoint (Microsoft SharePoint 2010) 中,Microsoft 将重点放在了开发人员情景上。除了 Visual Studio 2010 中包含的一流开发人员工具外,Microsoft 还增加了相当大的灵活性和大量功能,以便开发人员向为 SharePoint 2010 构建的自定义解决方案中添加日志记录和调试技术。本文演练了一些常见的日志记录和调试技术,开发人员在构建 SharePoint 2010 解决方案时可使用这些技术。

其他资源

有关详细信息,请参阅以下资源: