Google 致力于为黑人社区推动种族平等。查看具体行动

OpenThread 日志

在 GitHub 上查看源代码

OpenThread 日志由许多编译时配置常量控制。除非另有说明,否则以下文件中定义了这些常量:

openthread/src/core/config/logging.h

输出方法

OpenThread 支持不同的输出日志记录方法,定义为 OPENTHREAD_CONFIG_LOG_OUTPUT 的编译时配置常量。日志记录方法选项列在以下文件中:

openthread/src/core/config/logging.h

默认日志输出配置是 OPENTHREAD_CONFIG_LOG_OUTPUT_PLATFORM_DEFINED

在输出方法方面,您可能需要更新平台级配置常量,而不是核心配置常量。例如,如需在模拟示例应用中更改输出方法,请修改 openthread/examples/platforms/simulation/openthread-core-simulation-config.h 而不是 openthread/src/core/config/logging.h

日志级别

日志可能会输出不同级别的信息,定义为 OPENTHREAD_CONFIG_LOG_LEVEL 的编译时配置常量。这些级别选项列在以下文件中:

openthread/include/openthread/platform/logging.h

Platform Logging Macros API 参考中也有日志级别列表。

默认日志级别为 OT_LOG_LEVEL_CRIT,仅输出最关键的日志。更改级别以根据需要查看更多日志。如需查看所有 OpenThread 日志,请使用 OT_LOG_LEVEL_DEBG

日志区域

日志区域决定了 OpenThread 代码的哪些区域启用了日志记录。区域枚举在以下文件中定义:

openthread/include/openthread/platform/logging.h

Platform Logging Enumerations API 参考中也提供了日志区域列表。

日志区域通常用作日志函数中的参数。所有区域默认处于启用状态。

默认日志记录函数

OpenThread 中日志记录的默认函数为 otPlatLog,定义为 OPENTHREAD_CONFIG_PLAT_LOG_FUNCTION 的编译时配置常量。

如需详细了解此功能,请参阅 Platform Logging API 参考。

如需直接在 OpenThread 示例应用中使用此函数,请使用 OT_REFERENCE_DEVICE CMake 选项。例如,若要在 CC2538 示例的 CLI 应用中使用它,请运行以下命令:

./script/build -DOT_REFERENCE_DEVICE=ON

或者,您也可以在构建时更新 openthread/etc/cmake/options.cmake 文件,以默认启用该功能。

如何启用日志

启用日志之前,请确保您的环境已配置为构建 OpenThread。如需了解详情,请参阅构建 OpenThread

启用所有日志

如需快速启用所有日志级别和区域,请使用 OT_FULL_LOGS cmake 选项:

./script/build -DOT_FULL_LOGS=ON

此开关将日志级别设置为 OT_LOG_LEVEL_DEBG 并开启所有地区标志。

启用特定级别的日志

如需启用特定级别的日志,请修改 openthread/src/core/config/logging.h 并将 OPENTHREAD_CONFIG_LOG_LEVEL 更新为所需的级别,然后构建 OpenThread。例如,如需启用最高可达 OT_LOG_LEVEL_INFO 的日志,请运行以下命令:

#define OPENTHREAD_CONFIG_LOG_LEVEL OT_LOG_LEVEL_INFO
./script/build

在 syslog 中查看日志

默认情况下,日志将发送到 syslog。在 Linux 上,文件位置为 /var/log/syslog.

  1. 构建启用了所有日志的模拟示例:
    cd openthread
    ./script/cmake-build simulation -DOT_FULL_LOGS=ON
    
  2. 启动模拟节点:
    ./build/simulation/examples/apps/cli/ot-cli-ftd 1
    
  3. 在新的终端窗口中,设置 OT 日志的实时输出:
    tail -F /var/log/syslog | grep "ot-cli-ftd"
    
  4. 在模拟节点上,调出“线程”:
dataset init new
Done
dataset
Active Timestamp: 1
Channel: 13
Channel Mask: 07fff800
Ext PAN ID: d63e8e3e495ebbc3
Mesh Local Prefix: fd3d:b50b:f96d:722d/64
Network Key: dfd34f0f05cad978ec4e32b0413038ff
Network Name: OpenThread-8f28
PAN ID: 0x8f28
PSKc: c23a76e98f1a6483639b1ac1271e2e27
Security Policy: 0, onrcb
Done
dataset commit active
Done
ifconfig up
Done
thread start
Done

切换回运行 tail 命令的终端窗口。系统应该实时显示模拟节点的日志。请注意输出中的日志标记:[INFO][DEBG][NOTE]。这些日志都对应于日志级别。例如,如果将日志级别更改为 OT_LOG_LEVEL_INFODEBG 日志会从输出中消失。

ot-cli-ftd[30055]: [1] [DEBG]-MAC-----: SrcAddrMatch - Cleared all entries
ot-cli-ftd[30055]: [1] [INFO]-CORE----: Non-volatile: Read NetworkInfo {rloc:0x9c00, extaddr:1a4aaf5e97c852de, role:Leader, mode:0x0f, keyseq:0x0, ...
ot-cli-ftd[30055]: [1] [INFO]-CORE----: Non-volatile: ... pid:0x8581bc9, mlecntr:0x3eb, maccntr:0x3e8, mliid:05e4b515e33746c8}
ot-cli-ftd[30055]: [1] [INFO]-CORE----: Notifier: StateChanged (0x7f133b) [Ip6+ Ip6- LLAddr MLAddr Rloc+ KeySeqCntr NetData Ip6Mult+ Channel PanId NetName ExtPanId MstrKey PSKc SecPolicy]
ot-cli-ftd[30055]: [1] [INFO]-CLI-----: execute command: dataset panid
ot-cli-ftd[30055]: [1] [INFO]-CLI-----: execute command: dataset commit active
ot-cli-ftd[30055]: [1] [INFO]-MESH-CP-: Active dataset set
ot-cli-ftd[30055]: [1] [DEBG]-MAC-----: Idle mode: Radio sleeping
ot-cli-ftd[30055]: [1] [DEBG]-MAC-----: RadioPanId: 0x8f28
ot-cli-ftd[30055]: [1] [INFO]-CORE----: Notifier: StateChanged (0x007f0100) [KeySeqCntr Channel PanId NetName ExtPanId MstrKey PSKc SecPolicy]
ot-cli-ftd[30055]: [1] [INFO]-CLI-----: execute command: ifconfig up
ot-cli-ftd[30055]: [1] [DEBG]-MAC-----: Idle mode: Radio receiving on channel 11
ot-cli-ftd[30055]: [1] [INFO]-CLI-----: execute command: thread start
ot-cli-ftd[30055]: [1] [NOTE]-MLE-----: Role Disabled -> Detached
ot-cli-ftd[30055]: [1] [INFO]-MLE-----: Attempt to become router
ot-cli-ftd[30055]: [1] [INFO]-CORE----: Non-volatile: Read NetworkInfo {rloc:0x9c00, extaddr:1a4aaf5e97c852de, role:Leader, mode:0x0f, keyseq:0x0, ...
ot-cli-ftd[30055]: [1] [INFO]-CORE----: Non-volatile: ... pid:0x8581bc9, mlecntr:0x3eb, maccntr:0x3e8, mliid:05e4b515e33746c8}
ot-cli-ftd[30055]: [1] [INFO]-CORE----: Non-volatile: Saved NetworkInfo {rloc:0x9c00, extaddr:1a4aaf5e97c852de, role:Leader, mode:0x0f, keyseq:0x0, ...
ot-cli-ftd[30055]: [1] [INFO]-CORE----: Non-volatile: ... pid:0x8581bc9, mlecntr:0x7d4, maccntr:0x7d0, mliid:05e4b515e33746c8}
ot-cli-ftd[30055]: [1] [DEBG]-MLE-----: Store Network Information
ot-cli-ftd[30055]: [1] [INFO]-MLE-----: Send Link Request (ff02:0:0:0:0:0:0:2)

在 CLI 应用中查看日志

您可以直接在 OpenThread CLI 示例应用中查看日志。

  1. 修改示例平台的配置文件并将日志输出更改为应用。对于模拟示例,此为 openthread/examples/platforms/simulation/openthread-core-simulation-config.h
    #define OPENTHREAD_CONFIG_LOG_OUTPUT OPENTHREAD_CONFIG_LOG_OUTPUT_APP
    
  2. 构建具有所需日志级别的模拟示例。如需启用所有日志,请运行以下命令:
    ./script/cmake-build simulation -DOT_FULL_LOGS=ON
    
  3. 启动模拟节点:
    ./build/simulation/examples/apps/cli/ot-cli-ftd 1
    
  4. 处理命令时,您应该在 OpenThread CLI 所在的窗口中看到日志输出。

如果您已添加自定义日志记录并启用所有日志,则 CLI 行缓冲区或 UART 传输缓冲区可能不够大,无法处理额外的自定义日志。如果某些日志没有显示出来,应该尝试增加 CLI 行缓冲区的大小(在 /openthread/src/cli/cli_config.h 中定义为 OPENTHREAD_CONFIG_CLI_MAX_LINE_LENGTH)或增加 UART 传输缓冲区的大小:定义为平台配置文件中的 OPENTHREAD_CONFIG_CLI_UART_TX_BUFFER_SIZE,例如 /src/nrf52840/openthread-core-nrf52840-config.h

查看 NCP 日志

NCP 的日志可通过 wpantund 发送到主机的 syslog。对于 Linux 主机,此值为 /var/log/syslog.

使用 OPENTHREAD_CONFIG_LOG_OUTPUTOPENTHREAD_CONFIG_LOG_OUTPUT_APP 启用 NCP 日志记录。在平台的配置文件中更改该值。

例如,如需为连接到 Linux 主机的 nrf52840 启用此功能,请使用以下命令:

  1. 修改平台的配置文件,并将日志输出更改为应用。对于 nrf52840,此参数是 ot-nrf528xx 代码库中的 ./src/nrf52840/openthread-core-nrf52840-config.h
    #define OPENTHREAD_CONFIG_LOG_OUTPUT OPENTHREAD_CONFIG_LOG_OUTPUT_APP
    
  2. 使用所需的日志级别和其他特定于 NCP 的标志构建 nrf52840 示例。如需构建启用了所有日志的联接器,请执行以下操作:
    ./script/build nrf52840 UART_trans -DOT_JOINER=ON -DOT_FULL_LOGS=ON
    
  3. 刷写 NCP,将其连接到 Linux 主机,然后启动 wpantund(如 wpantund 代码库中所述)。

  4. NCP 运行后,请在 Linux 机器上检查 syslog

    tail -F /var/log/syslog | grep "wpantund"
    

  5. 您应该看到 NCP 实时显示 NCP 日志。您还可能会在 wpantund 输出中看到它们。

在运行时更改日志级别

如果启用了动态日志级别控制,则日志级别可以在运行时更改。

  1. 使用选项 -DOT_LOG_LEVEL_DYNAMIC=ON 构建应用。例如
    ./script/build nrf52840 UART_trans -DOT_JOINER=ON -DOT_FULL_LOGS=ON -DOT_LOG_LEVEL_DYNAMIC=ON
    
  2. 根据您的实现方式更改日志级别:
    1. 对于系统芯片 (SoC),请在 OpenThread 应用中使用 Logging API
    2. 对于 NCP,请在命令行中使用 wpanctl。查看wpan-properties.hwpantund代码库,其中包含所有公开属性wpanctl以及Spinel API了解其日志级别定义。
      wpanctl set OpenThread:LogLevel 5