如何使用KQL和Log Analytics查询Azure近30天新建资源列表
问题与解决方案
问题说明
需要通过Log Analytics获取Azure订阅中近30天创建的所有新资源列表,但对AzureActivity表的OperationNameValue列取值存在以下困惑:
- 发现创建资源时
OperationNameValue显示为Microsoft.Resource/Deployments/Write,但创建存储账户时未找到该值,这个值是否是正确的资源创建操作标识? - 活动日志中部分条目
OperationNameValue为MICROSOFT.RESOURCES/DEPLOYMENTS/WRITE,部分为Microsoft.Resource/Deployments/Write,二者有何区别?
附原查询:
AzureActivity | where TimeGenerated between (startofday(ago(30d)) ..startofday(now()) ) |where OperationNameValue == "MICROSOFT.RESOURCES/DEPLOYMENTS/WRITE" | parse tolower(_ResourceId) with "/subscriptions/" subscriptionId "/resourcegroups/" resourceGroup "/providers/" provider "/" resourceType "/" resourceName |where ActivityStatusValue == "Success" |project TimeGenerated,OperationNameValue,ActivityStatusValue,Caller,resourceName,ResourceGroup |order by TimeGenerated desc
解决方案
1. 资源创建操作的OperationNameValue说明
Microsoft.Resource/Deployments/Write(或其大写变体)是ARM模板部署操作的日志,仅记录通过ARM模板批量部署资源的行为,并非单个资源直接创建的操作标识。
直接创建单个资源时,对应的OperationNameValue格式为{资源提供商}/{资源类型}/write,例如:
- 创建存储账户:
Microsoft.Storage/storageAccounts/write - 创建虚拟机:
Microsoft.Compute/virtualMachines/write - 创建应用服务:
Microsoft.Web/sites/write
因此,要获取所有新创建的资源,需要匹配所有以/write结尾的操作,而非仅过滤部署操作。
2. 大小写变体的区别
MICROSOFT.RESOURCES/DEPLOYMENTS/WRITE和Microsoft.Resource/Deployments/Write本质是同一个操作,只是Azure日志记录时的大小写格式不统一导致的,没有功能或语义上的区别。查询时可以统一转换为小写(或大写)来避免遗漏。
3. 修正后的查询
以下查询可获取近30天所有成功创建的资源,覆盖直接创建和模板部署的场景:
AzureActivity | where TimeGenerated between (startofday(ago(30d)) .. startofday(now())) | where ActivityStatusValue == "Success" // 匹配所有资源的创建/更新操作(以/write结尾),兼容大小写 | where tolower(OperationNameValue) endswith "/write" // 解析资源信息,适配不同资源类型的ResourceId格式 | parse tolower(_ResourceId) with "/subscriptions/" subscriptionId "/resourcegroups/" resourceGroup "/providers/" provider "/" resourceType "/" resourceName // 排除部署资源本身(不需要记录部署操作可删除此条件) | where resourceType != "deployments" | project 创建时间=TimeGenerated, 操作类型=OperationNameValue, 状态=ActivityStatusValue, 创建者=Caller, 资源名称=resourceName, 资源类型=resourceType, 资源组=ResourceGroup, 订阅ID=subscriptionId | order by 创建时间 desc
补充说明
- 使用
tolower(OperationNameValue) endswith "/write"统一匹配所有大小写的write操作,避免遗漏日志。 - 添加
resourceType != "deployments"可排除ARM部署操作本身的日志,仅保留实际创建的资源;如果需要包含部署记录,可删除此条件。 - 扩展了
project列,增加资源类型和订阅ID,让结果信息更完整。
内容的提问来源于stack exchange,提问作者randomguy1289
相关产品推荐
相关产品推荐

