
本文详细介绍如何通过 azure http data collector api,使用 php 发送结构化日志数据到 azure monitor 自定义日志工作区,涵盖请求构造、身份验证、json 格式规范及完整可运行示例。
本文详细介绍如何通过 azure http data collector api,使用 php 发送结构化日志数据到 azure monitor 自定义日志工作区,涵盖请求构造、身份验证、json 格式规范及完整可运行示例。
Azure Monitor 的自定义日志(Custom Logs)通常通过两种方式接入数据:一是基于 Windows/Linux 代理的文件路径监控(如你配置的 C:\Logs\*.txt),该方式依赖 Log Analytics Agent 自动解析和上传;二是通过 HTTP Data Collector API 主动推送结构化数据——这正是 PHP 等后端语言最适用的方式。你当前配置的文件采集路径无法被 PHP 直接“写入触发”,而需切换为 API 方式实现程序化日志注入。
✅ 前置准备
- 启用 Data Collector API:在 Azure 门户中进入目标 Log Analytics 工作区 →「设置」→「使用情况和估算」→ 确保「Data Collection Rules」或「Data Collector API」已启用(部分旧工作区需手动开启)。
-
获取工作区 ID 和共享密钥:
- 工作区 ID:门户 → Log Analytics 工作区 →「概览」→「ID」(即 workspaceId)
- 共享密钥:「设置」→「代理管理」→「主要密钥」或「次要密钥」(Base64 编码的密钥)
-
构造请求 URI:
https://<workspace-id>.ods.opinsights.azure.com/api/logs?api-version=2016-04-01
替换 <workspace-id> 为实际 ID(不含 -,仅字母数字,如 abcdef0123456789)。
? PHP 实现示例(含签名与错误处理)
以下代码使用 cURL 发送带 HMAC-SHA256 签名的 POST 请求,符合 Azure API 安全要求:
<?php
// 配置参数(请替换为你的实际值)
$workspaceId = 'your-workspace-id-here'; // 如:a1b2c3d4e5f678901234567890abcdef
$sharedKey = 'your-shared-key-here'; // Base64 编码的密钥(如:dXNlci1rZXktYmFzZTY0...)
$logType = 'MyCustomLog'; // 自定义日志表名(无需 .CL,系统自动添加)
$timestamp = gmdate('D, d M Y H:i:s T'); // RFC 1123 时间戳
// 待发送的日志数据(支持数组嵌套,但建议扁平化)
$records = [
[
'Timestamp' => date('c'),
'Level' => 'INFO',
'Message' => 'User login successful',
'UserId' => 12345,
'SourceIP' => $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1'
],
[
'Timestamp' => date('c'),
'Level' => 'ERROR',
'Message' => 'Database connection failed',
'ErrorCode' => 500,
'DurationMs' => 124.7
]
];
// 构建 JSON 请求体
$body = json_encode($records);
$rfc1123date = $timestamp;
$contentLength = strlen($body);
// 构造签名字符串
$stringToHash = "POST\n$contentLength\napplication/json\nx-ms-date:$rfc1123date\n/api/logs";
$decodedKey = base64_decode($sharedKey);
$hash = hash_hmac('sha256', $stringToHash, $decodedKey, true);
$signature = base64_encode($hash);
// 设置请求头
$headers = [
"Content-Type: application/json",
"Authorization: SharedKey {$workspaceId}:{$signature}",
"Log-Type: {$logType}",
"x-ms-date: {$rfc1123date}",
"time-generated-field: Timestamp" // 可选:指定时间字段用于索引
];
// 发送请求
$url = "https://{$workspaceId}.ods.opinsights.azure.com/api/logs?api-version=2016-04-01";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 生产环境请启用证书验证!
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
echo "✅ 日志成功提交至 Azure Monitor!";
} else {
echo "❌ 请求失败,HTTP 状态码:{$httpCode}\n";
echo "响应内容:" . ($response ?: '空响应');
}
?>⚠️ 关键注意事项
- 日志表名规则:Log-Type 头部值(如 MyCustomLog)将生成名为 MyCustomLog_CL 的表,仅支持字母、数字、下划线,首字符必须为字母,长度 ≤ 100 字符。
- 时间字段:强烈建议在每条记录中包含 Timestamp 字段(ISO 8601 格式),并配合 time-generated-field: Timestamp 头部,确保正确时间索引。
- 大小限制:单次请求 ≤ 30MB,单条记录 ≤ 32KB,最多 1000 条记录/请求。超限需分批发送。
- 速率限制:默认 1000 次请求/分钟/工作区,高吞吐场景需申请配额提升。
- 安全性:生产环境务必启用 CURLOPT_SSL_VERIFYPEER => true 并配置 CA 证书;共享密钥切勿硬编码或提交至 Git。
? 验证与排查
提交后,可在 Azure 门户中打开 Log Analytics 工作区 →「日志」→ 执行查询:
立即学习“PHP免费学习笔记(深入)”;
MyCustomLog_CL | take 10
若无结果,请检查:
- 工作区 ID 和密钥是否准确(注意密钥是 Base64 编码字符串,非明文);
- 网络是否允许出站 HTTPS 访问 *.ods.opinsights.azure.com;
- 请求头 Authorization 是否按规范拼接(含换行符 \n);
- 返回的 HTTP 状态码(400=格式错误,403=签名无效,404=工作区不存在)。
通过此方案,你即可完全绕过文件路径监控的局限性,以编程方式将 PHP 应用日志实时、可靠地注入 Azure Monitor,实现集中化可观测性。



















