从IoT Edge部署中检索日志

适用范围:IoT Edge 1.5 checkmark IoT Edge 1.5

重要

IoT Edge 1.5 LTS 是受支持的版本。 IoT Edge 1.4 LTS 于 2024 年 11 月 12 日终止。 如果使用的是早期版本,请参阅 Update IoT Edge

使用 IoT Edge 代理模块中的直接方法获取 IoT Edge 部署的日志,而无需物理访问或 SSH 访问。 直接方法在设备上运行,你可以从云中调用它们。 IoT Edge代理具有直接方法,可帮助你远程监视和管理IoT Edge设备。 本文中的直接方法从版本 1.0.10 开始提供。

有关直接方法、如何使用它们以及如何将其添加到自己的模块的详细信息,请参阅 了解并调用来自 IoT Hub 的直接方法

这些直接方法的名称区分大小写。

为了与此功能保持最佳兼容性,请使用以下日志记录格式:

<{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模块的日志。

提示

使用 sinceuntil 筛选器选项限制检索的日志范围。 如果在没有边界的情况下调用此直接方法,它将获取所有日志,这些日志可能很大、耗时或成本高昂。

Azure portal中的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 数组 包含idfilter元组的数组。
id 字符串 一个指定模块名称的正则表达式。 它可以匹配边缘设备上的多个模块。 .NET正则表达式格式。 如果多个项具有与同一模块匹配的 ID,则只有第一个匹配 ID 的筛选器选项适用于该模块。
筛选器 JSON 章节 应用于与元组中id正则表达式匹配模块的日志筛选器。
尾巴 整数 从最新日志行开始获取的过去的日志行数。 可选。
因为 字符串 仅返回自此时间以来的日志,作为 rfc3339 时间戳、UNIX 时间戳或持续时间(天(d)、小时(h)、分钟(m))。 例如,可以将一天、12 小时和 30 分钟的持续时间指定为“1 天 12 小时 30 分钟”或“1d 12h 30m”。 如果同时指定 tailsince,则首先使用 since 值筛选日志,然后将 tail 值应用于结果。 可选。
直到 字符串 仅以 rfc3339 时间戳、UNIX 时间戳或持续时间(天(d)、小时(h)、分钟(m)的形式返回指定时间之前的日志。 例如,持续时间为 90 分钟,可指定为 90 分钟90 米。 如果同时指定 tailsince,则首先使用 since 值筛选日志,然后将 tail 值应用于结果。 可选。
loglevel 整数 筛选等于指定日志级别的日志行。 日志行应遵循推荐的日志记录格式,并采用 Syslog 严重性级别标准。 如果你需要按多个日志级别严重性值进行筛选,请依赖于正则表达式匹配(前提是模块在记录不同的严重性级别时遵循某种一致的格式)。 可选。
regex 字符串 使用 .NET 正则表达式格式筛选与指定正则表达式匹配的日志行。 可选。
编码 字符串 gzipnone。 默认为 none
内容类型 字符串 jsontext。 默认为 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 portal中,调用方法 GetModuleLogs 和以下 JSON 有效负载:

    {
       "schemaVersion": "1.0",
       "items": [
          {
             "id": "edgeAgent",
             "filter": {
                "tail": 10
             }
          }
       ],
       "encoding": "none",
       "contentType": "text"
    }

在 Azure 门户中调用直接方法 GetModuleLogs 的截图。

你还可以将 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 Storage容器。

注意事项

使用 sinceuntil 筛选器选项限制检索的日志范围。 在没有边界的情况下调用此直接方法会检索所有日志,这些日志可能很大、耗时或成本高昂。

若要从网关设备后面的设备上传日志,请确保在顶层设备上配置了 API 代理和blob storage模块。 这些模块通过网关设备将日志从下层设备路由到云中的存储。

此方法接受类似于 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) 具有写入权限的共享访问签名URL,用于Azure Blob Storage容器

成功的上传日志请求会返回“状态: 200”,然后是具有以下模式的有效负载:

    {
        "status": "string",
        "message": "string",
        "correlationId": "GUID"
    }
名称 类型 描述
状态 字符串 NotStartedRunningCompletedFailedUnknown 中的一个。
消息 字符串 如果出现错误,则为消息;否则为空字符串。
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 portal 中,将 sasUrl 替换为您的详细信息后,使用方法名称 UploadModuleLogs 和以下 JSON 有效负载来调用该方法:

    {
       "schemaVersion": "1.0",
       "sasUrl": "<sasUrl>",
       "items": [
          {
             "id": "edgeAgent",
             "filter": {
                "tail": 10
             }
          }
       ],
       "encoding": "none",
       "contentType": "text"
    }

在 Azure 门户中调用 UploadModuleLogs 直接方法的屏幕截图。

上传支持包诊断

使用 UploadSupportBundle 直接方法将IoT Edge模块日志的 zip 文件捆绑并上传到可用的Azure Blob Storage容器。 此直接方法在 IoT Edge 设备上运行 iotedge support-bundle 命令以获取日志。

注意事项

若要从网关设备后面的设备上传日志,请确保在顶层设备上设置了 API 代理和blob storage模块。 这些模块通过网关设备将日志从下层设备路由到云中的存储。

此方法接受具有以下架构的 JSON 有效负载:

    {
        "schemaVersion": "1.0",
        "sasUrl": "Full path to SAS url",
        "since": "2d",
        "until": "1d",
        "edgeRuntimeOnly": false
    }
名称 类型 描述
schemaVersion 字符串 设置为 1.0
sasURL 字符串 (URI) 具有写入权限的共享访问签名URL,用于Azure Blob Storage容器
因为 字符串 返回此时间之后的日志,作为 RFC 3339 时间戳、UNIX 时间戳或持续时间(天 (d) 小时 (h) 分钟 (m))。 例如,将一天、12 小时和 30 分钟指定为 1 天 12 小时 30 分钟1d 12 小时 30 米。 可选。
直到 字符串 在此时间之前返回日志,作为 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"
    }
名称 类型 描述
状态 字符串 NotStartedRunningCompletedFailedUnknown 中的一个。
消息 字符串 如果错误,则为消息;否则为空字符串。
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 portal中,在替换自己的 SAS URL 后,使用方法名称 UploadSupportBundle和以下 JSON 有效负载调用该方法:

    {
        "schemaVersion": "1.0",
        "sasUrl": "Full path to SAS url",
        "since": "2d",
        "until": "1d",
        "edgeRuntimeOnly": false
    }

在 Azure 门户中调用 UploadSupportBundle 直接方法的截图。

获取上传请求状态

使用 GetTaskStatus 直接方法检查上传日志请求的状态。 GetTaskStatus 请求有效负载使用上传日志请求中的correlationId来获取任务状态。 correlationId 来自对 UploadModuleLogs 直接方法调用的响应。

此方法接受具有以下架构的 JSON 有效负载:

    {
      "schemaVersion": "1.0",
      "correlationId": "<GUID>"
    }

成功上传日志请求后,会返回“状态: 200”,后跟一个与 UploadModuleLogs 响应模式相同的有效负载:

    {
        "status": "string",
        "message": "string",
        "correlationId": "GUID"
    }
名称 类型 描述
状态 字符串 NotStartedRunningCompletedFailedCancelledUnknown 的其中一个。
消息 字符串 如果错误,则为消息;否则为空字符串。
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 portal中,使用方法名称GetTaskStatus和以下 JSON 有效负载调用该方法。 请将 <GUID> 替换为你自己的值。

    {
      "schemaVersion": "1.0",
      "correlationId": "<GUID>"
    }

Azure 门户的截图,显示如何调用直接方法 GetTaskStatus。

后续步骤

IoT Edge 代理和IoT Edge中心模块孪生的属性