第3章 诊断设置:把 Azure 资源日志送进 Log Analytics

说实话,很多刚接触 Azure Monitor 的朋友,第一步就卡在“日志到底怎么进去?”这个问题上。

我记得自己第一次配诊断设置时,愣是对着门户点了半天,结果发现日志根本没过来。原因特别简单——我忘了勾选“发送到 Log Analytics”。嗯,这种低级错误犯一次就够了。

这一章,咱们就把诊断设置这回事彻底捋清楚。说白了,它就是 Azure 资源跟 Log Analytics 工作区之间的一根“数据管道”。没有这根管子,你啥日志都别想查。

3.1 诊断设置是什么?

诊断设置(Diagnostic Settings)是 Azure 平台内置的一个配置机制。它的作用就一个:把某个 Azure 资源产生的平台日志和指标,转发到你指定的目标位置。目标位置可以是 Log Analytics 工作区、存储账户、事件中心,或者 Azure 合作伙伴解决方案。

我在项目里见过不少人,试图用代理(Agent)去采集 Azure 平台日志——那完全是绕弯子。平台日志,比如 Azure 活动日志、资源日志、指标,根本不需要代理,诊断设置就是最正的路。

核心原则:诊断设置只处理“平台级”数据,不处理“来宾 OS 级”数据。虚拟机内部的应用程序日志、系统日志,得靠 Log Analytics 代理或 Azure Monitor Agent 来搞定。别混了。

3.2 支持诊断设置的资源类型

不是所有 Azure 资源都支持诊断设置。我整理了一张常用清单,你在项目里大概率会遇到这些:

资源类型 是否支持 常见日志类别举例
Azure SQL 数据库 是 QueryStoreRuntimeStatistics, Errors
Azure Key Vault 是 AuditEvent, VaultAccess
Azure 负载均衡器 是 LoadBalancerAlertEvent, ProbeHealthStatus
Azure 应用程序网关 是 AccessLog, PerformanceLog, FirewallLog
Azure Functions 是 FunctionAppLogs, AppMetrics
Azure Kubernetes Service (AKS) 是 kube-apiserver, kube-controller-manager
Azure 存储账户 是 StorageRead, StorageWrite, StorageDelete
经典虚拟机(来宾级别) 否(需代理) —

检查你的资源是否支持,最快的方法是:在 Azure 门户打开资源,左侧菜单里找“诊断设置”或“Monitoring → Diagnostic settings”。如果有这个菜单项,说明可以配。

3.3 创建诊断设置:两种方式

我通常用两种方式创建诊断设置,看场景选:

3.3.1 Azure 门户(傻瓜式)

适合少量资源、临时调试。步骤很简单:

  1. 打开目标资源,找到“诊断设置”
  2. 点击“+ 添加诊断设置”
  3. 输入名称,比如 “SendToLAW-Prod”
  4. 勾选你要发送的日志类别和指标
  5. 在“目标详细信息”里选择“发送到 Log Analytics 工作区”
  6. 选择你的工作区(注意:工作区必须跟资源在同一个 Azure AD 租户)
  7. 保存

小建议:命名时最好带上环境标识,比如 “PROD-SQL-MetricsToLAW”。我吃过亏,因为随便写了“test2”,一个月后谁也不记得那是啥。

3.3.2 ARM 模板 / Terraform(工程化)

生产环境我坚决不用手动配,太容易漏。用代码定义诊断设置,可重复、可审计。下面是一个标准的 ARM 模板片段:

{
  "type": "Microsoft.Insights/diagnosticSettings",
  "apiVersion": "2021-05-01-preview",
  "name": "SendToLAW",
  "properties": {
    "workspaceId": "[parameters('workspaceResourceId')]",
    "logs": [
      {
        "category": "AuditEvent",
        "enabled": true,
        "retentionPolicy": {
          "enabled": false,
          "days": 0
        }
      }
    ],
    "metrics": [
      {
        "category": "AllMetrics",
        "enabled": true,
        "retentionPolicy": {
          "enabled": false,
          "days": 0
        }
      }
    ]
  }
}

你看,这里面有个关键点:retentionPolicy 我都设置成 false。为什么?因为日志到了 Log Analytics 工作区之后,保留策略统一在工作区层面管理。如果你在诊断设置里又设了保留天数,两个策略会打架,最后谁也说不清。

注意:诊断设置中如果设置 retentionPolicy.enabled = true 且 days > 0,Azure 会在日志发送到目标之前先按这个天数截断。我碰到过一次诡异情况:用户说工作区里看不到历史数据,查了半天发现诊断设置里 retentionDays=30,而工作区保留是365天,结果第31天的数据直接被平台丢弃了。

3.4 诊断设置的工作原理

你可能好奇:数据从资源到 Log Analytics 到底经历了什么?我画了一张图来解释这整个流程。

诊断设置数据流 Azure 资源 (如 KeyVault / SQL) 平台日志/指标 诊断设置 规则引擎 (类别筛选 + 目标路由) 路由 Log Analytics 工作区 诊断设置的其他目标选项(可选) 📦 存储账户 📨 事件中心 🔌 合作伙伴集成 诊断设置支持多个目标同时发送(适合存档 + 实时分析) 💡 一次配好诊断设置后,日志会持续自动推送到目标,无需手动干预

你看这个流程:资源产生日志 → 诊断设置按你选的类别过滤 → 路由到 Log Analytics(或其他目标)。整个过程是实时的,Azure 内部走的是平台专属通道,不占用资源本身的网络带宽。

3.5 常见踩坑点

我这些年修过的诊断设置相关问题,总结下来就这几类:

  • 日志延迟:诊断设置的日志延迟通常在 5-15 分钟。如果你发现实时性要求高的场景(比如入侵检测),可以考虑用事件中心配合流分析。
  • 配额限制:每个 Azure 资源最多只能创建 5 个诊断设置。我以前遇到过一口气配了 6 个,结果第 6 个直接报错。合理规划,尽量复用同一个设置发送多个目标。
  • 跨租户限制:诊断设置的目标(Log Analytics 工作区)必须与资源在同一个 Azure AD 租户内。不能把 A 租户的日志发到 B 租户的工作区。跨租户场景需要用事件中心中转。
  • 删除诊断设置:当你删除一个诊断设置后,数据会在几分钟内停止流入目标。但是已经发送的数据不会丢失。我曾经在排障时删除了诊断设置重新配,结果把问题日志中断了 10 分钟,后来才意识到应该先加一个新设置再删旧的,这样能保证连续性。

经验之谈:如果你在排查“为什么日志没进工作区”,最有效的办法是先查 AzureActivity 表里有没有对应诊断设置的创建操作。如果创建成功,但日志没来,可能是资源本身没有产生对应的日志类别。比如 Azure SQL 的 QueryStoreRuntimeStatistics,只有开启了查询存储才会有数据。

3.6 通过 API 检查诊断设置状态

运维时我经常要批量检查所有资源的诊断设置配置对不对。手动点门户太慢,可以用 Azure CLI 或 PowerShell 来查。

Azure CLI 示例:

# 列出某个资源的所有诊断设置
az monitor diagnostic-settings list \
  --resource /subscriptions/{subId}/resourceGroups/{rg}/providers/Microsoft.KeyVault/vaults/{vaultName} \
  --output table

# 获取某个诊断设置的详细信息
az monitor diagnostic-settings show \
  --resource /subscriptions/{subId}/resourceGroups/{rg}/providers/Microsoft.KeyVault/vaults/{vaultName} \
  --name "SendToLAW"

PowerShell 示例:

# 获取资源组内所有已启用诊断设置的资源
Get-AzDiagnosticSetting -ResourceGroupName "myRG" | 
  Select-Object Name, ResourceId, WorkspaceId, Logs, Metrics

这两个命令我几乎每周都要敲。尤其在做巡检的时候,我会写个脚本去对比“所有应配日志的资源”和“实际有诊断设置的资源”,找出漏配项。

核心结论:诊断设置是整个 Azure Monitor 日志架构的“入水管”。水管没接好,后面所有分析、告警、可视化全白搭。花 10 分钟把诊断设置配清楚,能省你后续无数排查时间。

3.7 本章小结

诊断设置本身不复杂,但细节特别多。记住三件事:

  • 只适用于平台日志,来宾 OS 日志用代理
  • 不要跟工作区保留策略冲突
  • 生产环境用代码部署,避免人为遗漏