你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 诊断故障排除

本文介绍与使用Azure 诊断相关的故障排除信息。 有关诊断的详细信息,请参阅 Azure 诊断 概述

重要

Azure 诊断扩展已于 2026 年 3 月 31 日弃用,不再受支持。 不推荐进行此扩展的新部署。 若要确保持续支持和访问新功能,请迁移到此处推荐的替代解决方案

逻辑组件

组件如下:

  • 诊断插件启动器(DiagnosticsPluginLauncher.exe):它启动诊断扩展。 它用作入口点进程。
  • 诊断插件(DiagnosticsPlugin.exe):它配置、启动和管理监视代理的生存期。 它是由启动器启动的主要过程。
  • 监视代理(MonAgent*.exe 进程):它监视、收集和传输诊断数据。

日志/项目路径

以下路径指向一些重要日志和项目。 本文始终引用此信息。

Azure 云服务

项目 路径
Azure 诊断配置文件 %SystemDrive%\Packages\Plugins\Microsoft.Azure.Diagnostics.PaaSDiagnostics<version>\Config.txt
日志文件 C:\Logs\Plugins\Microsoft.Azure.Diagnostics.PaaSDiagnostics<version>\
诊断数据的本地存储 C:\Resources\Directory<CloudServiceDeploymentID>\<RoleName>\DiagnosticStore\WAD0107\Tables
监视代理配置文件 C:\Resources\Directory<CloudServiceDeploymentID>。<RoleName>。DiagnosticStore\WAD0107\Configuration\MaConfig.xml
Azure 诊断扩展包 %SystemDrive%\Packages\Plugins\Microsoft.Azure.Diagnostics.PaaSDiagnostics<version>
日志收集实用工具路径 %SystemDrive%\Packages\GuestAgent\
MonAgentHost 日志文件 C:\Resources\Directory<CloudServiceDeploymentID>.<RoleName>.DiagnosticStore\WAD0107\Configuration\MonAgentHost.<seq_num>.log

虚拟机

项目 路径
Azure 诊断配置文件 C:\Packages\Plugins\Microsoft.Azure\Diagnostics.IaaSDiagnostics<version>\RuntimeSettings
日志文件 C:\WindowsAzure\Logs\Plugins\Microsoft.Azure.Diagnostics.IaaSDiagnostics<DiagnosticsVersion>\
诊断数据的本地存储 C:\WindowsAzure\Logs\Plugins\Microsoft.Azure\Diagnostics.IaaSDiagnostics<DiagnosticsVersion>\WAD0107\Tables
监视代理配置文件 C:\WindowsAzure\Logs\Plugins\Microsoft.Azure\Diagnostics.IaaSDiagnostics<DiagnosticsVersion>\WAD0107\Configuration\MaConfig.xml
状态文件 C:\Packages\Plugins\Microsoft.Azure.Diagnostics.IaaSDiagnostics<version>\Status
Azure 诊断扩展包 C:\Packages\Plugins\Microsoft.Azure\Diagnostics.IaaSDiagnostics<DiagnosticsVersion>
日志收集实用工具路径 C:\WindowsAzure\Logs\WaAppAgent.log
MonAgentHost 日志文件 C:\WindowsAzure\Logs\Plugins\Microsoft.Azure.Diagnostics.IaaSDiagnostics<DiagnosticsVersion>\WAD0107\Configuration\MonAgentHost.<seq_num>.log

指标数据不会显示在Azure门户中

诊断提供可在Azure门户中显示的指标数据。 如果在门户中查看数据时遇到问题,请检查诊断存储帐户中的 WADMetrics\* 表,查看是否存在相应的指标记录,并确保 资源提供者Microsoft.Insights 已注册。

此处,表的 PartitionKey 是资源 ID、虚拟机或虚拟机规模集。 RowKey 是指标名称,也称为性能计数器名称。

如果资源 ID 不正确,请检查 诊断配置>指标>ResourceId ,以查看资源 ID 是否已正确设置。

如果没有特定指标数据,请检查“诊断配置”>“PerformanceCounter”,以查看是否包含指标(性能计数器)。 默认启用以下计数器:

  • \Processor(_Total)% Processor Time
  • \内存\可用字节
  • \ASP.NET Applications(Total)\Requests/Sec
  • \ASP.NET Applications(Total)\Errors Total/Sec
  • \ASP.NET\请求队列
  • \ASP.NET\Requests Rejected
  • \Processor(w3wp)% 处理器时间
  • \Process(w3wp)\Private Bytes
  • \Process(WaIISHost)% 处理器时间
  • \进程(WaIISHost)\私有字节
  • \Process(WaWorkerHost)% 处理器时间
  • \Process(WaWorkerHost)\私有字节
  • \内存\页面错误次数/秒
  • .NET CLR Memory(Global)% Time in GC
  • \LogicalDisk(C:)\磁盘写入字节/秒
  • \LogicalDisk(C:)\磁盘读取字节/秒
  • \LogicalDisk(D:)\磁盘写入字节数/秒
  • \LogicalDisk(D:)\磁盘读取字节数/秒

如果配置设置正确,但仍看不到指标数据,请按照以下指南进行故障排除。

Azure 诊断未启动

有关诊断无法启动的原因的信息,请参阅前面提供的日志文件位置中的 DiagnosticsPluginLauncher.logDiagnosticsPlugin.log 文件。

如果这些日志中如有指示 Monitoring Agent not reporting success after launch,则说明启动 MonAgentHost.exe 时出现了故障。 查看上一节“虚拟机”中指示的 MonAgentHost 日志文件所在位置的日志。

日志文件的最后一行包含退出代码。

DiagnosticsPluginLauncher.exe Information: 0 : [4/16/2016 6:24:15 AM] DiagnosticPlugin exited with code 0

如果发现退出代码,请参阅“引用”部分中退出代码表

诊断数据未记录到Azure 存储

确定是未显示数据还是仅显示了部分数据。

诊断基础结构日志

诊断将在诊断基础结构日志中记录所有错误。 请确保在 配置中启用了诊断基础结构日志捕获。 然后,可在配置的存储帐户中快速查找 DiagnosticInfrastructureLogsTable 表中显示的任何相关错误。

未显示数据

完全不显示事件数据的最常见原因,是存储帐户信息定义不正确。

解决方案:更正诊断配置,然后重新安装诊断。

如果存储帐户配置正确,请远程访问计算机并验证 DiagnosticsPlugin.exeMonAgentCore.exe 正在运行。 如果诊断服务未运行,请按照 Azure 诊断 不启动中的步骤操作。

如果进程正在运行,请转到是否在本地捕获数据? 然后,按照那里的说明进行操作。

如果仍有问题,请尝试:

  1. 卸载代理。
  2. 删除目录 C:\WindowsAzure\Logs\Plugins\Microsoft.Azure。Diagnostics.IaaSDiagnostics
  3. 再次安装代理。

部分数据丢失

如果获得了部分数据,则表示数据收集/传输管道设置正确。 请按照此处的子节说明,缩小问题范围。

是否配置了收集?

诊断配置包含要收集的特定类型数据的介绍。 查看配置,以验证是否仅查找已配置进行收集的数据。

主机是否生成数据?

  • 性能计数器:打开 perfmon 并检查计数器。
  • 跟踪日志:远程访问 VM,并向应用的配置文件添加一个 TextWriterTraceListener 。 若要设置文本侦听器,请参阅 “创建和初始化跟踪侦听器”。 确保 <trace> 元素具有 <trace autoflush="true">。 如果没有看到生成跟踪日志,请查看“关于缺失的跟踪日志的更多信息”部分。
  • Windows 事件跟踪 (ETW) 跟踪:远程访问 VM 并安装 PerfView 工具。 在 PerfView 中,运行 文件>用户命令>Listen etwprovider1>etwprovider2 等。 Listen 命令区分大小写,并且 ETW 提供程序的逗号分隔列表之间不能有空格。 如果命令未能运行,可选择 PerfView 工具右下角的“日志”,查看尝试运行的内容以及结果。 假设输入正确,则会打开一个新窗口。 几秒钟后,会看到 ETW 跟踪记录。
  • 事件日志:远程访问 VM。 打开事件查看器并确保事件存在。

数据是否是本地捕获的?

接下来,请确保本地捕获到了数据。 数据本地存储在诊断数据本地存储中的 *.tsf 文件中。 不同类型的日志被收集在不同的 .tsf 文件中。 这些名称类似于Azure 存储中的表名。

例如,性能计数器被收集到 PerformanceCountersTable.tsf 中。 在 WindowsEventLogsTable.tsf 中收集事件日志。 使用本地日志提取部分中的说明打开本地收集文件,并验证它们是否是在磁盘上收集的。

如果看不到本地收集的日志,并且已验证主机是否正在生成数据,则可能遇到配置问题。 仔细查看配置。

此外,请查看为 MonitoringAgent MaConfig.xml生成的配置。 验证是否存在描述相关日志源的部分。 然后验证该部分未在诊断配置和监视代理配置间的转换中丢失。

是否传输了数据?

如果已验证数据在本地捕获,但仍未在存储帐户中看到数据,请执行以下步骤:

  • 请确认您提供了正确的存储帐户,并且没有对给定存储帐户的密钥进行轮换。 对于Azure 云服务,有时用户不会更新 useDevelopmentStorage=true
  • 验证提供的存储帐户是否正确。 确保未受到一些禁止组件访问公共存储终结点的网络限制。 执行此操作的一种方法是远程访问计算机,并自行尝试向相同的存储帐户写入一些内容。
  • 最后,可以查看监视代理报告的故障。 监视代理在 maeventtable.tsf 中写入日志,该日志位于诊断数据的本地存储中。 若要打开此文件,请按照 “本地日志提取 ”部分中的说明进行作。 然后尝试确定是否有 errors 指示读取本地文件或写入存储失败。

捕获和存档日志

如果打算联系支持人员,他们可能会要求你做的第一件事是从计算机收集日志。 可以通过自行收集节省时间。 在日志收集实用程序路径上运行 CollectGuestLogs.exe 实用程序。 它生成一个 .zip 文件,其中包含同一文件夹中所有相关Azure日志。

找不到诊断数据表

保存 ETW 事件的Azure 存储中的表使用以下代码进行命名:

        if (String.IsNullOrEmpty(eventDestination)) {
            if (e == "DefaultEvents")
                tableName = "WADDefault" + MD5(provider);
            else
                tableName = "WADEvent" + MD5(provider) + eventId;
        }
        else
            tableName = "WAD" + eventDestination;

下面是一个示例:

        <EtwEventSourceProviderConfiguration provider="prov1">
          <Event id="1" />
          <Event id="2" eventDestination="dest1" />
          <DefaultEvents />
        </EtwEventSourceProviderConfiguration>
        <EtwEventSourceProviderConfiguration provider="prov2">
          <DefaultEvents eventDestination="dest2" />
        </EtwEventSourceProviderConfiguration>
"EtwEventSourceProviderConfiguration": [
    {
        "provider": "prov1",
        "Event": [
            {
                "id": 1
            },
            {
                "id": 2,
                "eventDestination": "dest1"
            }
        ],
        "DefaultEvents": {
            "eventDestination": "DefaultEventDestination",
            "sinks": ""
        }
    },
    {
        "provider": "prov2",
        "DefaultEvents": {
            "eventDestination": "dest2"
        }
    }
]

此代码生成四个表:

事件 表名称
provider=“prov1” <事件 ID=“1” /> WADEvent+MD5("prov1")+"1"
provider=“prov1” <Event ID=“2” eventDestination=“dest1” /> WADdest1
provider=“prov1” <DefaultEvents /> WADDefault+MD5("prov1")
provider=“prov2” <DefaultEvents eventDestination=“dest2” /> WADdest2

参考

请查看以下参考资料

检查诊断扩展配置

检查扩展配置的最简单方法是转到 Azure 资源资源管理器。 然后转到诊断扩展 (IaaSDiagnostics/PaaDiagnostics) 所在的虚拟机或云服务。

或者,通过远程桌面连接到计算机,查看“日志项目路径”部分中描述的诊断配置文件。

在任一情况下,搜索 Microsoft.Azure.DiagnosticsxmlCfgWadCfg 字段。

如果要在虚拟机上搜索并且 存在 WadCfg 字段,则表示配置采用 JSON 格式。 如果 存在 xmlCfg 字段,则表示配置位于 XML 中,并且经过 base64 编码。 需要 对其进行解码 才能查看诊断加载的 XML。

对于云服务角色,如果从磁盘选择配置,数据采用 base64 编码。 需要 对其进行解码 才能查看诊断加载的 XML。

Azure 诊断插件退出代码

该插件返回以下退出代码:

退出代码 说明
0 成功。
-1 常规错误。
-2 无法加载 rcf 文件。

仅当在 VM 上不正确地手动调用了来宾代理插件启动器时,才会发生此内部错误。

-3 无法加载诊断配置文件。

解决方案:这是配置文件未通过架构验证的结果。 解决方案是提供符合架构的配置文件。

-4 监视代理诊断的另一个实例已在使用本地资源目录。

解决方案:为“LocalResourceDirectory”指定不同的值。

-6 来宾代理插件启动器尝试使用无效的命令行启动诊断。

仅当在 VM 上不正确地手动调用了来宾代理插件启动器时,才会发生此内部错误。

-10 诊断插件因未处理的异常而退出。
-11 来宾代理程序无法创建负责启动和监视监视代理的进程。

解决方案:验证是否有足够的系统资源可用于启动新进程。

-101 调用诊断插件时参数无效。

仅当在 VM 上不正确地手动调用了来宾代理插件启动器时,才会发生此内部错误。

-102 插件进程将无法初始化自身。

解决方案:验证是否有足够的系统资源可用于启动新进程。

-103 插件进程将无法初始化自身。 具体而言,它无法创建记录器对象。

解决方案:验证是否有足够的系统资源可用于启动新进程。

-104 无法加载来宾代理提供的 rcf 文件。

仅当在 VM 上不正确地手动调用了来宾代理插件启动器时,才会发生此内部错误。

-105 诊断插件无法打开诊断配置文件。

仅当诊断插件在 VM 上被手动调用错误时,才会发生此内部错误。

-106 无法读取诊断配置文件。

这是配置文件未通过架构验证的结果。

解决方案:提供符合架构的配置文件。 有关详细信息,请参阅 “检查诊断扩展配置”。

-107 传递给监视代理的资源目录无效。

此内部错误应仅当在 VM 上不正确地手动调用了监视代理时才会发生。

-108 无法将诊断配置文件转换为监视代理配置文件。

这是一个内部错误,仅当使用无效的配置文件手动调用了诊断插件时才会发生。

-110 常规诊断配置错误。

这是一个内部错误,仅当使用无效的配置文件手动调用了诊断插件时才会发生。

-111 无法启动监视代理。

解决方案:验证是否有足够的系统资源可用。

-112 常规错误。

本地日志提取

监视代理将日志和项目收集为 .tsf 文件。 .tsf 文件不可读,但可以将其转换为 .csv,如下所示:

<Azure diagnostics extension package>\Monitor\x64\table2csv.exe <relevantLogFile>.tsf

将在与相应 <relevantLogFile>.csv 文件相同的路径中创建一个名为 .tsf 的新文件。

注意

只需对主 .tsf 文件(例如 PerformanceCountersTable.tsf)运行此实用工具。 将自动处理随附的文件(例如 PerformanceCountersTables_\*\*001.tsfPerformanceCountersTables_\*\*002.tsf)。

关于跟踪日志丢失的更多信息

注意

以下信息主要适用于Azure 云服务,除非在基础结构即服务 (IaaS) VM 上运行的应用程序上配置了 DiagnosticsMonitorTraceListener

  • 确保在 web.config 或 app.config中配置 DiagnosticMonitorTraceListener 。它默认在云服务项目中进行配置。 但是,有些客户会将其注释掉,导致诊断无法收集跟踪语句。
  • 如果未从 OnStartRun 方法写入日志,请确保 DiagnosticMonitorTraceListener 位于 app.config中。默认情况下,它位于 web.config中,但仅适用于 w3wp.exe中运行的代码。 因此需将其置于 app.config 中,以捕获在 WaIISHost.exe 中运行的跟踪
  • 请确保使用的是 Diagnostics.Trace.TraceXXX ,而不是 Diagnostics.Debug.WriteXXX。 调试语句将从发布版本中删除。
  • 确保已编译的代码实际上具有 Diagnostics.Trace 行。 使用反射器、ildasm 或 ILSpy 进行验证。 Diagnostics.Trace 命令将从编译的二进制文件中删除,除非使用 TRACE 条件编译符号。 这是使用 MSBuild 构建项目时常会发生的问题。

已知问题和缓解措施

以下已知问题具有缓解措施。

.NET 4.5 依赖项

Windows的 Azure 诊断 扩展依赖于 .NET Framework 4.5 或更高版本。 编写时,为Azure 云服务预配的所有计算机以及基于Azure VM 的所有官方映像都安装了 .NET 4.5 或更高版本。

尝试在未.NET 4.5 或更高版本的计算机上为Windows运行 Azure 诊断 扩展时,仍可能会遇到这种情况。 从旧映像或快照创建计算机或者自带自定义磁盘时,会发生这种情况。

运行DiagnosticsPluginLauncher.exe时,此问题通常显示为退出代码 255 由于以下未经处理的异常,发生故障:

System.IO.FileLoadException: Could not load file or assembly 'System.Threading.Tasks, Version=1.5.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies

Mitigation:在设备上安装 .NET 4.5 或更高版本。

性能计数器数据在存储中可用,但不显示在门户中

默认情况下,VM 中的门户体验会显示某些性能计数器。 如果未看到性能计数器,且知道正在生成数据,因为数据在存储中可用,请确保检查:

  • 存储中的数据是否有英文计数器名称。 如果计数器名称不是英语的,则门户指标图表无法识别它。

    • 缓解措施:将系统帐户的计算机语言更改为英语。 若要更改它,请选择 控制面板>region>Administrative>Copy Settings。 接下来,清除“欢迎界面和系统帐户”,以免将自定义语言应用到系统帐户。
  • 如果在性能计数器名称中使用通配符 (*),则在将性能计数器发送到 Azure 存储接收器时,门户无法关联已配置和已收集的计数器。

    • 缓解措施:若要确保可以使用通配符并让门户展开 (*),请将性能计数器路由到“Azure Monitor”接收器。