你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于:IoT Edge 1.5
重要
IoT Edge 1.5 LTS 是受支持的版本。 IoT Edge 1.4 LTS 的生命周期结束日期为 2024 年 11 月 12 日。 如果你使用的是早期版本,请参阅更新 IoT Edge。
使用 IoT Edge 代理模块中的直接方法从 IoT Edge 部署获取日志,而无需物理或 SSH 访问。 直接方法在设备上运行,你可以从云中调用它们。 IoT Edge 代理具有直接方法,可帮助你远程监视和管理 IoT Edge 设备。 本文中的直接方法从版本 1.0.10 开始提供。
有关直接方法、如何使用它们以及如何将其添加到自己的模块的详细信息,请参阅 了解和调用 IoT 中心的直接方法。
这些直接方法的名称区分大小写。
推荐的日志记录格式
为了与此功能保持最佳兼容性,请使用以下日志记录格式:
<{Log Level}> {Timestamp} {Message Text}
格式 {Timestamp}
为 yyyy-MM-dd HH:mm:ss.fff zzz
. 根据 Syslog 标准中的严重性代码,使用下表中的 {Log Level}
值。
值 | 严重程度 |
---|---|
0 | 紧急情况 |
1 | 警报 |
2 | 严重 |
3 | 错误 |
4 | 警告 |
5 | 通知 |
6 | 信息 |
7 | 调试 |
IoT Edge 中的 Logger 类是规范实现。
检索模块日志
使用 GetModuleLogs 直接方法获取 IoT Edge 模块的日志。
提示
使用 since
和 until
筛选器选项限制检索的日志范围。 如果在没有边界的情况下调用此直接方法,它将获取所有日志,这些日志可能很大、耗时或成本高昂。
Azure 门户中的 IoT Edge 故障排除页提供了一种更简单的查看模块日志的方法。 有关详细信息,请参阅在 Azure 门户中对 IoT Edge 设备进行监视和故障排除。
此方法接受具有以下架构的 JSON 有效负载:
{
"schemaVersion": "1.0",
"items": [
{
"id": "regex string",
"filter": {
"tail": "int",
"since": "string",
"until": "string",
"loglevel": "int",
"regex": "regex string"
}
}
],
"encoding": "gzip/none",
"contentType": "json/text"
}
名称 | 类型 | 描述 |
---|---|---|
schemaVersion | 字符串 | 设置为 1.0 |
物品 | JSON 数组 | 具有 id 和 filter 元组的数组。 |
id | 字符串 | 一个指定模块名称的正则表达式。 它可以匹配边缘设备上的多个模块。 应为 .NET 正则表达式格式。 如果多个项具有与同一模块匹配的 ID,则只有第一个匹配 ID 的筛选器选项适用于该模块。 |
过滤器 | JSON 部分 | 要应用于与元组中 id 正则表达式匹配的模块的日志筛选器。 |
tail | 整数 | 从最新日志行开始获取的过去的日志行数。 可选。 |
since | 字符串 | 仅返回自此时间以来的日志,作为 rfc3339 时间戳、UNIX 时间戳或持续时间(天(d)、小时(h)、分钟(m))。 例如,可以将一天、12 小时和 30 分钟的持续时间指定为“1 天 12 小时 30 分钟”或“1d 12h 30m”。 如果同时指定 tail 和 since ,则首先使用 since 值筛选日志,然后将 tail 值应用于结果。 可选。 |
until | 字符串 | 仅以 rfc3339 时间戳、UNIX 时间戳或持续时间(天(d)、小时(h)、分钟(m)的形式返回指定时间之前的日志。 例如,持续时间为 90 分钟,可指定为 90 分钟 或 90 米。 如果同时指定了 tail 和 since ,则首先使用 since 值筛选日志,然后将 tail 值应用于结果。 可选。 |
loglevel | 整数 | 筛选等于指定日志级别的日志行。 日志行应遵循建议的日志记录格式,并使用 Syslog 严重性级别 标准。 如果需要按多个日志级别严重性值进行筛选,请使用正则表达式匹配,前提是模块对不同的严重性级别使用一致格式。 可选。 |
regex | 字符串 | 使用 .NET 正则表达式 格式筛选与指定正则表达式匹配的日志行。 可选。 |
编码 | 字符串 | gzip 或 none 。 默认为 none 。 |
内容类型 | 字符串 | json 或 text 。 默认为 text 。 |
注意
如果日志内容超出了直接方法的响应大小限制(当前为 128 KB),则响应将返回错误。
成功的日志检索将返回 “status”:200,随后是一个包含模块日志的数据包,并根据请求中您指定的设置进行筛选。
例如:
az iot hub invoke-module-method --method-name 'GetModuleLogs' -n <hub name> -d <device id> -m '$edgeAgent' --method-payload \
'
{
"schemaVersion": "1.0",
"items": [
{
"id": "edgeAgent",
"filter": {
"tail": 10
}
}
],
"encoding": "none",
"contentType": "text"
}
'
在 Azure 门户中,调用该方法 GetModuleLogs
和以下 JSON 有效负载:
{
"schemaVersion": "1.0",
"items": [
{
"id": "edgeAgent",
"filter": {
"tail": 10
}
}
],
"encoding": "none",
"contentType": "text"
}
你还可以将 CLI 输出传输到 Linux 实用程序(如 gzip),以处理压缩的响应。 例如:
az iot hub invoke-module-method \
--method-name 'GetModuleLogs' \
-n <hub name> \
-d <device id> \
-m '$edgeAgent' \
--method-payload '{"contentType": "text","schemaVersion": "1.0","encoding": "gzip","items": [{"id": "edgeHub","filter": {"since": "2d","tail": 1000}}],}' \
-o tsv --query 'payload[0].payloadBytes' \
| base64 --decode \
| gzip -d
上传模块日志
使用 UploadModuleLogs 直接方法将请求的日志发送到特定的 Azure Blob 存储容器。
注意
使用 since
和 until
筛选器选项限制检索的日志范围。 在没有边界的情况下调用此直接方法会检索所有日志,这些日志可能很大、耗时或成本高昂。
若要从网关设备后面的设备上传日志,请确保在顶层设备上配置 API 代理和 Blob 存储模块 。 这些模块通过网关设备将日志从下层设备路由到云中的存储。
此方法接受类似于 GetModuleLogs 的 JSON 有效负载,并添加了“sasUrl”密钥:
{
"schemaVersion": "1.0",
"sasUrl": "Full path to SAS URL",
"items": [
{
"id": "regex string",
"filter": {
"tail": "int",
"since": "string",
"until": "string",
"loglevel": "int",
"regex": "regex string"
}
}
],
"encoding": "gzip/none",
"contentType": "json/text"
}
名称 | 类型 | 描述 |
---|---|---|
sasURL | 字符串 (URI) | 对 Azure Blob 存储容器具有写入权限的共享访问签名 URL。 |
上传日志请求成功后,会返回“状态: 200”,后跟具有以下架构的有效负载:
{
"status": "string",
"message": "string",
"correlationId": "GUID"
}
名称 | 类型 | 描述 |
---|---|---|
地位 | 字符串 | NotStarted 、Running 、Completed 、Failed 或 Unknown 中的一个。 |
消息 | 字符串 | 如果出现错误,则为消息;否则为空字符串。 |
correlationId | 字符串 | 用于检查上传请求状态的 ID。 |
例如,以下调用从压缩 JSON 格式的所有模块上传最后 100 条日志行:
az iot hub invoke-module-method --method-name UploadModuleLogs -n <hub name> -d <device id> -m '$edgeAgent' --method-payload \
'
{
"schemaVersion": "1.0",
"sasUrl": "<sasUrl>",
"items": [
{
"id": ".*",
"filter": {
"tail": 100
}
}
],
"encoding": "gzip",
"contentType": "json"
}
'
以下调用从 edgeAgent 和 edgeHub 上传最后 100 条日志行,以及 tempSensor 模块的最后 1,000 条日志行(采用未压缩的文本格式):
az iot hub invoke-module-method --method-name UploadModuleLogs -n <hub name> -d <device id> -m '$edgeAgent' --method-payload \
'
{
"schemaVersion": "1.0",
"sasUrl": "<sasUrl>",
"items": [
{
"id": "edge",
"filter": {
"tail": 100
}
},
{
"id": "tempSensor",
"filter": {
"tail": 1000
}
}
],
"encoding": "none",
"contentType": "text"
}
'
在 Azure 门户中,用你的信息替代 sasUrl 后,调用名为 UploadModuleLogs
且包含以下 JSON 有效负载的方法:
{
"schemaVersion": "1.0",
"sasUrl": "<sasUrl>",
"items": [
{
"id": "edgeAgent",
"filter": {
"tail": 10
}
}
],
"encoding": "none",
"contentType": "text"
}
上传支持捆绑诊断
使用 UploadSupportBundle 直接方法将 IoT Edge 模块日志的 zip 文件捆绑并上传到可用的 Azure Blob 存储容器。 此直接方法在 IoT Edge 设备上运行 iotedge support-bundle
命令以获取日志。
注意
若要从网关设备后面的设备上传日志,请确保在顶层设备上设置了 API 代理和 Blob 存储模块 。 这些模块通过网关设备将日志从下层设备路由到云中的存储。
此方法接受具有以下架构的 JSON 有效负载:
{
"schemaVersion": "1.0",
"sasUrl": "Full path to SAS url",
"since": "2d",
"until": "1d",
"edgeRuntimeOnly": false
}
名称 | 类型 | 描述 |
---|---|---|
schemaVersion | 字符串 | 设置为 1.0 。 |
sasURL | 字符串 (URI) | 对 Azure Blob 存储容器具有写入权限的共享访问签名 URL。 |
since | 字符串 | 返回此时间之后的日志,作为 RFC 3339 时间戳、UNIX 时间戳或持续时间(天 (d) 小时 (h) 分钟 (m))。 例如,将一天、12 小时和 30 分钟指定为 1 天 12 小时 30 分钟 或 1d 12 小时 30 米。 可选。 |
until | 字符串 | 在此时间之前返回日志,作为 RFC 3339 时间戳、UNIX 时间戳或持续时间(天(d)、小时(h)、分钟(m)。 例如,将 90 分钟指定为 90 分钟 或 90 米。 可选。 |
edgeRuntimeOnly | 布尔 | 如果为 true,则仅从 Edge 代理、Edge 中心和 Edge 安全守护程序返回日志。 默认值:false。 可选。 |
重要
IoT Edge 支持捆绑包可以包含个人身份信息。
成功的上传日志请求返回 “status”:200 和与 UploadModuleLogs 响应相同的架构的有效负载:
{
"status": "string",
"message": "string",
"correlationId": "GUID"
}
名称 | 类型 | 描述 |
---|---|---|
地位 | 字符串 | NotStarted 、Running 、Completed 、Failed 或 Unknown 中的一个。 |
消息 | 字符串 | 如果错误,则为消息;否则为空字符串。 |
correlationId | 字符串 | 用于查询上传请求状态的 ID。 |
在以下示例中,将占位符文本 <hub name>
和 <device id>
替换为你自己的值。
az iot hub invoke-module-method --method-name 'UploadSupportBundle' -n <hub name> -d <device id> -m '$edgeAgent' --method-payload \
'
{
"schemaVersion": "1.0",
"sasUrl": "Full path to SAS url",
"since": "2d",
"until": "1d",
"edgeRuntimeOnly": false
}
'
在 Azure 门户中,用你自己的 SAS URL 进行替换后,调用名为 UploadSupportBundle
、包含以下 JSON 有效负载的方法:
{
"schemaVersion": "1.0",
"sasUrl": "Full path to SAS url",
"since": "2d",
"until": "1d",
"edgeRuntimeOnly": false
}
获取上传请求状态
使用 GetTaskStatus 直接方法检查上传日志请求的状态。 GetTaskStatus 请求有效负载使用上传日志请求中的correlationId
来获取任务状态。 correlationId
来自对 UploadModuleLogs 直接方法调用的响应。
此方法接受具有以下架构的 JSON 有效负载:
{
"schemaVersion": "1.0",
"correlationId": "<GUID>"
}
上传日志请求成功后,会返回“状态: 200”,后跟架构与 UploadModuleLogs 响应相同的有效负载:
{
"status": "string",
"message": "string",
"correlationId": "GUID"
}
名称 | 类型 | 描述 |
---|---|---|
地位 | 字符串 | NotStarted 、Running 、Completed 、Failed 、Cancelled 或 Unknown 的其中一个。 |
消息 | 字符串 | 如果错误,则为消息;否则为空字符串。 |
correlationId | 字符串 | 用于查询上传请求状态的 ID。 |
例如:
az iot hub invoke-module-method --method-name 'GetTaskStatus' -n <hub name> -d <device id> -m '$edgeAgent' --method-payload \
'
{
"schemaVersion": "1.0",
"correlationId": "<GUID>"
}
'
在 Azure 门户中,以方法名称 GetTaskStatus
和以下 JSON 有效负载调用该方法。 请将 <GUID>
替换为你自己的值。
{
"schemaVersion": "1.0",
"correlationId": "<GUID>"
}