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/src/core/config/logging.h 대신 openthread/examples/platforms/simulation/openthread-core-simulation-config.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 옵션을 사용합니다. 예를 들어 CLI 앱에서 CC2538 예시에 이 코드를 사용하려면 다음 안내를 따르세요.

./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_INFO로 변경하면 DEBG 로그가 출력에서 사라집니다.

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 전송 버퍼는 추가 커스텀 로그를 처리할 만큼 크지 않을 수 있습니다. 일부 로그가 표시되어야 할 때 표시되지 않으면 /openthread/src/cli/cli_config.h에서 OPENTHREAD_CONFIG_CLI_MAX_LINE_LENGTH로 정의된 CLI 라인 버퍼의 크기를 늘리거나, 플랫폼의 구성 파일(예: /src/nrf52840/openthread-core-nrf52840-config.h)에서 OPENTHREAD_CONFIG_CLI_UART_TX_BUFFER_SIZE로 정의된 UART 전송 버퍼의 크기를 늘려보세요.

NCP 로그 보기

NCP 로그는 wpantund를 통해 호스트의 syslog로 전송될 수 있습니다. Linux 호스트의 경우 /var/log/syslog.

OPENTHREAD_CONFIG_LOG_OUTPUT_APPOPENTHREAD_CONFIG_LOG_OUTPUT 값을 사용하여 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에 대해 OpenThread 로그가 실시간으로 표시됩니다. 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를 사용합니다. wpanctl에 노출된 모든 속성은 wpantund 저장소의 wpan-properties.h을, 로그 수준 정의는 Spinel API를 참고하세요.
      wpanctl set OpenThread:LogLevel 5