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

查询 Azure 资源的日志

在 Azure Monitor Log Analytics 中,查询通常在工作区的上下文中执行。 一个工作区可以包含许多资源的数据,因此很难隔离特定资源的数据。 此外,资源还可将数据发送到多个工作区。 为了简化这种体验,REST API 允许直接查询 Azure 资源以获取其日志。

响应格式

Azure 资源查询会生成与针对 Log Analytics 工作区的查询相同的响应形状

URL 格式

假设某个 Azure 资源使用完全限定的标识符:

/subscriptions/<sid>/resourceGroups/<rg>/providers/<providerName>/<resourceType>/<resourceName>

针对直接 API 终结点查询此资源的日志时会转到以下 URL:

https://api.loganalytics.azure.com/v1/subscriptions/<sid>/resourceGroups/<rg>/providers/<providerName>/<resourceType>/<resourceName>/query

通过 ARM 对同一资源运行的查询将使用以下 URL:

https://management.azure.com/subscriptions/<sid>/resourceGroups/<rg>/providers/<providerName>/<resourceType>/<resourceName>/providers/microsoft.insights/logs?api-version=2018-03-01-preview

实质上,此 URL 是完全限定的 Azure 资源加上扩展提供程序:/providers/microsoft.insights/logs

表访问和 RBAC

microsoft.insights 资源提供程序公开一组新的操作,用于在表级别控制对日志的访问。 对于名为 tableName 的表,这些操作采用以下格式。

microsoft.insights/logs/<tableName>/read 

可以使用 actions 属性允许使用指定的表,并使用 notActions 属性禁止使用指定的表来将此权限添加到角色。

工作区访问控制

Azure 资源查询将 Log Analytics 工作区视为可能的数据源。 但管理员可以通过 RBAC 角色锁定对工作区的访问权限。 默认情况下,API 仅返回用户有权访问的工作区中的结果。

工作区管理员可以使用 Azure 资源查询,而不会中断现有的 RBAC。 借助工作区上的布尔属性,具有读取权限的用户可以查看特定 Azure 资源的日志,但不可查询包含这些日志的工作区。

这是将访问范围限定为工作区级别的表的操作:

microsoft.operationalinsights/workspaces/query/<tableName>/read

错误响应

下面简要列出了查询 Azure 资源时出现的常见失败情况以及症状行为的描述。

Azure 资源不存在

    HTTP/1.1 404 Not Found 
    { 
        "error": { 
            "message": "The resource /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/test-rg/providers/microsoft.storage/storageaccounts/exampleResource was not found", 
            "code": "ResourceNotFoundError" 
        }
    }
}

无权访问资源

HTTP/1.1 403 Forbidden 
{
    "error": { 
        "message": "The provided credentials have insufficient access to  perform the requested operation", 
        "code": "InsufficientAccessError", 
        "innererror": { 
            "code": "AuthorizationFailedError",
            "message": "User '92eba38a-70da-42b0-ab83-ffe82cce658f' does not have access to read logs for this resource"
        }
    } 
}

资源中没有日志,或者对包含这些日志的工作区没有权限

根据数据和权限的精确组合,响应可能包含 200 而无结果数据,也可能引发语法错误(4xx 错误)。

部分访问权限

在某些情况下,用户可能对特定资源的日志拥有部分访问权限。 如果用户缺少以下任一权限,则会发生这种情况:

  • 对包含 Azure 资源日志的工作区的访问权限。
  • 对查询中的表引用的访问权限。

用户会看到常规响应,其中已按无提示方式筛选掉用户无权访问的数据源。要查看有关用户对 Azure 资源、基础 Log Analytics 工作区以及特定表的访问权限的信息,请在请求中包含标头 Prefer: include-permissions=true。 这会导致响应 JSON 包含如下所示的部分:

{ 
    "permissions": { 
        "resources": [ 
            { 
                "resourceId": "/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.Compute/virtualMachines/VM1", 
                "dataSources": [ 
                    "/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.OperationalInsights/workspaces/WS1" 
                ] 
            }, 
            { 
                "resourceId": "/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.Compute/virtualMachines/VM2", 
                "denyTables": [ 
                    "SecurityEvent", 
                    "SecurityBaseline" 
                ], 
                "dataSources": [ 
                    "/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.OperationalInsights/workspaces/WS2",
                    "/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.OperationalInsights/workspaces/WS3" 
                ] 
            } 
        ], 
        "dataSources": [ 
            { 
                "resourceId": "/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.OperationalInsights/workspaces/WS1", 
                "denyTables": [ 
                    "Tables.Custom" 
                ] 
            }, 
            { 
                "resourceId": "/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.OperationalInsights/workspaces/WS2" 
            } 
        ] 
    } 
}

resources 有效负载描述查询两个 VM 的尝试。 VM1 将数据发送到工作区 WS1,而 VM2 将数据发送到两个工作区:WS2 和 WS3。 此外,用户无权查询资源的 SecurityEventSecurityBaseline 表。

dataSources 有效负载通过描述用户可查询的工作区来进一步筛选结果。 用户无权在此处查询 WS3,以及从 WS1 中筛选掉的另一个表。

下面清楚地说明了此类查询会返回哪些数据:

  • WS1 中 VM1 的日志,不包括表。 从工作区自定义。
  • WS2 中 VM2 的日志,不包括 SecurityEvent 和 SecurityBaseline。