你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

检索 IoT Edge 部署中的日志

适用于:IoT Edge 1.5 复选标记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 模块的日志。

提示

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

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 数组 具有 idfilter 元组的数组。
id 字符串 一个指定模块名称的正则表达式。 它可以匹配边缘设备上的多个模块。 应为 .NET 正则表达式格式。 如果多个项具有与同一模块匹配的 ID,则只有第一个匹配 ID 的筛选器选项适用于该模块。
过滤器 JSON 部分 要应用于与元组中 id 正则表达式匹配的模块的日志筛选器。
tail 整数 从最新日志行开始获取的过去的日志行数。 可选。
since 字符串 仅返回自此时间以来的日志,作为 rfc3339 时间戳、UNIX 时间戳或持续时间(天(d)、小时(h)、分钟(m))。 例如,可以将一天、12 小时和 30 分钟的持续时间指定为“1 天 12 小时 30 分钟”或“1d 12h 30m”。 如果同时指定 tailsince,则首先使用 since 值筛选日志,然后将 tail 值应用于结果。 可选。
until 字符串 仅以 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 门户中,调用该方法 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 存储容器。

注意

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

若要从网关设备后面的设备上传日志,请确保在顶层设备上配置 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"
    }
名称 类型 描述
地位 字符串 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 门户中,用你的信息替代 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 存储容器。 此直接方法在 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"
    }
名称 类型 描述
地位 字符串 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 门户中,用你自己的 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 门户中,以方法名称 GetTaskStatus 和以下 JSON 有效负载调用该方法。 请将 <GUID> 替换为你自己的值。

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

Azure 门户的屏幕截图,其中显示了如何调用直接方法 GetTaskStatus。

后续步骤

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