能否通过Data Collector API将自定义日志推送至Log Analytics Workspace内置表?
能否通过Data Collector API将自定义日志推送至Log Analytics内置表(如AzureDiagnostics)?
可以的,通过Data Collector API确实能将自定义日志发送到Log Analytics的内置表(比如AzureDiagnostics),但需要严格遵循内置表的Schema要求,同时在请求中指定正确的目标表名。
具体操作步骤
1. 确认目标内置表的Schema
首先要明确目标表(如AzureDiagnostics)的必填字段和数据格式。以AzureDiagnostics为例,核心必填字段包括:
TimeGenerated:日志生成时间,必须为ISO 8601格式(例如2024-05-20T12:34:56Z)ResourceId:关联的Azure资源ID(无实际资源时,可构造符合格式的字符串,比如/subscriptions/{subscription-id}/resourceGroups/{rg-name}/providers/Microsoft.Compute/virtualMachines/{vm-name})Category:日志类别,可自定义但需符合表的字段规则OperationName:操作名称,按需填写
你可以在Log Analytics工作区的「表」视图中查看目标内置表的完整Schema,确保推送的日志字段匹配。
2. 构造符合Schema的日志数据
构造JSON格式的日志数据,严格对齐目标表的字段。示例(针对AzureDiagnostics):
[ { "TimeGenerated": "2024-05-20T14:20:00Z", "ResourceId": "/subscriptions/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx/resourceGroups/my-rg/providers/Microsoft.Web/sites/my-webapp", "Category": "CustomAppLogs", "OperationName": "UserLogin", "Level": "Information", "Message": "User john_doe logged in successfully", "CustomField1": "CustomValue1" } ]
额外的自定义字段会自动添加到表的
Properties字段中,或作为独立列(取决于表的配置)。
3. 调用API时指定目标表名
在API请求的URL和请求头中明确目标内置表名:
- 请求URL格式:
https://<workspace-id>.ods.opinsights.azure.com/api/logs?api-version=2016-04-01 - 核心请求头:
Content-Type: application/jsonLog-Type: AzureDiagnostics(必须与内置表名完全一致)Authorization: SharedKey <workspace-id>:<shared-key>(用工作区主键/次键生成签名)
4. 生成合法的Authorization签名
签名需使用工作区ID和共享密钥,步骤如下:
- 构造字符串:
POST\n<content-length>\napplication/json\nx-ms-date:<date>\n/api/logs - 用HMAC-SHA256算法,以共享密钥加密上述字符串,再做Base64编码
- 最终Authorization头格式:
SharedKey <workspace-id>:<base64-encoded-signature>
5. 发送API请求
用POST方法发送请求,示例curl命令:
curl -X POST \ https://<workspace-id>.ods.opinsights.azure.com/api/logs?api-version=2016-04-01 \ -H 'Authorization: SharedKey <workspace-id>:<generated-signature>' \ -H 'Content-Type: application/json' \ -H 'Log-Type: AzureDiagnostics' \ -H 'x-ms-date: <current-date-in-rfc1123-format>' \ -d '[ { "TimeGenerated": "2024-05-20T14:20:00Z", "ResourceId": "/subscriptions/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx/resourceGroups/my-rg/providers/Microsoft.Web/sites/my-webapp", "Category": "CustomAppLogs", "OperationName": "UserLogin", "Level": "Information", "Message": "User john_doe logged in successfully" } ]'
注意事项
- 必须严格匹配内置表的必填字段,否则日志会被拒绝或无法正确解析
- 部分内置表有特殊校验规则,比如
ResourceId必须符合Azure资源ID格式,否则无法归类到正确的资源视图 - 若推送字段与内置表现有字段冲突,可能导致数据解析异常,建议先推送少量测试数据验证
内容的提问来源于stack exchange,提问作者dev333
相关产品推荐
相关产品推荐

