로그 시스템의 개요

ROS2의 로그 시스템은 시스템에서 발생하는 다양한 이벤트, 상태, 오류 등을 기록하고 이를 바탕으로 시스템의 동작을 분석할 수 있는 기능을 제공한다. ROS2는 다양한 레벨의 로그를 지원하며, 이를 통해 사용자는 시스템의 상태와 문제점을 효과적으로 모니터링할 수 있다. ROS2의 로그 시스템은 rcutils라는 기본 라이브러리를 통해 구현되며, 노드 단위에서 발생하는 로그는 ROS2 프레임워크에 의해 자동으로 수집된다.

ROS2의 로그는 다음과 같은 로그 레벨을 제공한다: - Debug: 상세한 정보를 제공하며, 주로 개발 중에 유용하다. - Info: 일반적인 정보를 나타내며, 시스템의 정상적인 상태를 모니터링할 때 사용된다. - Warn: 경고 메시지로, 시스템 동작에는 문제가 없지만 주의를 요하는 상황을 기록한다. - Error: 오류 메시지로, 시스템에서 문제가 발생했을 때 이를 기록한다. - Fatal: 치명적인 오류로 인해 시스템이 종료되어야 하는 상황을 나타낸다.

로그 설정 및 사용 방법

ROS2의 로그 설정은 주로 노드의 rclcpp 또는 rclpy 인터페이스를 통해 이루어진다. 기본적으로 로그 메시지를 출력할 때는 ROS2의 로그 API를 호출한다. 예를 들어, C++의 RCLCPP_INFO 또는 Python의 rclpy.logging.get_logger()를 이용해 로그 메시지를 생성할 수 있다.

C++에서 로그를 출력하는 방법:

#include "rclcpp/rclcpp.hpp"

int main(int argc, char *argv[])
{
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("my_node");

  RCLCPP_INFO(node->get_logger(), "This is an info message");
  RCLCPP_WARN(node->get_logger(), "This is a warning message");
  RCLCPP_ERROR(node->get_logger(), "This is an error message");

  rclcpp::spin(node);
  rclcpp::shutdown();
  return 0;
}

Python에서 로그를 출력하는 방법:

import rclpy
from rclpy.node import Node

class MyNode(Node):
    def __init__(self):
        super().__init__('my_node')
        self.get_logger().info('This is an info message')
        self.get_logger().warn('This is a warning message')
        self.get_logger().error('This is an error message')

def main(args=None):
    rclpy.init(args=args)
    node = MyNode()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

로그 레벨 설정

각 노드에서 로그 레벨을 설정하여 출력할 로그의 범위를 제한할 수 있다. 기본적으로는 Info 레벨 이상의 로그만 출력되며, 더 많은 로그를 보고 싶다면 Debug 레벨로 설정할 수 있다. ROS2에서 로그 레벨을 설정하는 방법은 두 가지가 있다: 1. 환경 변수 설정: 환경 변수를 이용해 전체 시스템에 대해 로그 레벨을 설정할 수 있다. bash export RCUTILS_LOGGING_SEVERITY=DEBUG

  1. 노드별 설정: C++이나 Python에서 노드별로 로그 레벨을 설정할 수 있다. C++에서는 set_logger_level()을 사용한다. cpp node->get_logger().set_level(rclcpp::Logger::Level::Debug);

Python에서도 마찬가지로 노드의 로그 레벨을 설정할 수 있다.

node.get_logger().set_level(rclpy.logging.LoggingSeverity.DEBUG)

로그 출력 포맷

로그 메시지의 출력 형식은 기본적으로 시간, 노드 이름, 로그 레벨, 메시지를 포함한다. 이를 통해 로그를 쉽게 분석할 수 있으며, 각 메시지의 발생 시점과 위치를 정확하게 파악할 수 있다.

기본 포맷 예시:

[INFO] [time] [node_name]: This is an info message

포맷을 변경하고 싶다면 환경 변수를 통해 설정할 수 있다. 예를 들어, RCUTILS_LOGGING_FORMAT 환경 변수를 설정하여 로그 메시지의 포맷을 커스터마이징할 수 있다.

export RCUTILS_LOGGING_FORMAT="[{severity}] [{name}]: {message}"

로그 파일 저장

ROS2에서는 로그 메시지를 파일로 저장할 수 있는 기능을 제공한다. 기본적으로는 로그 메시지가 표준 출력으로 나타나지만, 사용자가 로그를 파일로 저장하고 싶다면 RCUTILS_LOGGING_USE_STDOUT 환경 변수를 활용하거나 ROS2 노드에서 파일로 로그를 저장하는 옵션을 설정할 수 있다.

환경 변수를 통한 로그 파일 설정

환경 변수를 사용하여 로그를 파일로 저장하려면, RCUTILS_LOGGING_OUTPUT_HANDLER를 설정할 수 있다. 예를 들어, 로그를 파일에 저장하려면 아래와 같이 환경 변수를 설정한다.

export RCUTILS_LOGGING_OUTPUT_HANDLER=file
export RCUTILS_LOGGING_FILE_NAME=/path/to/your/logfile.log

이 설정을 통해 로그 메시지가 표준 출력 대신 파일에 기록된다.

rcl_logging 모듈을 통한 파일 저장

ROS2에서는 rcl_logging이라는 모듈을 사용하여 로그를 보다 세밀하게 제어할 수 있다. 이를 통해 로그 파일 경로, 포맷, 파일 크기 제한 등의 다양한 옵션을 설정할 수 있다. 이를 사용하면 로그 파일이 너무 커지지 않도록 관리하거나, 여러 파일로 로그를 분할 저장하는 등의 기능을 구현할 수 있다.

로그 필터링

ROS2는 로그를 필터링하여 원하는 로그 메시지만 출력하거나, 특정 노드 또는 패키지의 로그만 표시하는 기능을 제공한다. 로그 필터링을 사용하면 시스템에서 발생하는 대량의 로그 중에서 중요하거나 관심 있는 부분만을 확인할 수 있어 디버깅에 매우 유용하다.

로그 필터링은 RCUTILS_LOGGING_SEVERITY_THRESHOLD 환경 변수를 사용해 설정할 수 있으며, 필터링할 로그 레벨을 설정하여 그 이상의 로그만 출력되도록 할 수 있다.

export RCUTILS_LOGGING_SEVERITY_THRESHOLD=INFO

이 경우, Info 레벨 이상의 로그만 출력되며, Debug 로그는 무시된다. 이를 통해 로그의 가독성을 높이고, 필요한 정보에 집중할 수 있다.

로그 스케줄링

ROS2에서는 실시간 시스템 또는 특정 작업 스케줄에 따라 로그 메시지를 효율적으로 관리할 수 있도록 로그 스케줄링 기능도 제공한다. 예를 들어, 특정 시간 간격마다 로그를 수집하거나, 시스템 부하를 줄이기 위해 로그 메시지를 일시적으로 지연 출력하는 등의 스케줄링을 설정할 수 있다.

이를 통해 시스템 자원의 효율적인 사용과 함께 로그 데이터를 필요한 시점에 적시에 수집할 수 있다.

노드 단위 로그 관리

ROS2는 각 노드별로 로그를 개별적으로 관리할 수 있다. 이는 대규모 분산 시스템에서 특히 유용하며, 각 노드에서 발생하는 로그를 독립적으로 수집하고 분석할 수 있다. 노드별로 로그 설정을 달리하거나, 특정 노드에서만 디버그 로그를 활성화하는 등의 방식으로 효율적으로 로그 시스템을 운영할 수 있다.

노드별로 로그를 관리하려면, 노드 이름을 명시하여 로그 설정을 변경할 수 있다. 예를 들어, 특정 노드에서만 Debug 로그를 활성화하려면 다음과 같이 설정할 수 있다.

export RCUTILS_LOGGING_SEVERITY=DEBUG
export RCUTILS_LOGGING_OUTPUT_FILE=/path/to/logfile.log

이 설정은 특정 노드에서 발생하는 로그만을 별도로 파일로 저장하는 예시이다.

로그 모니터링 도구

ROS2는 다양한 로그 모니터링 도구를 제공하여 시스템의 상태를 실시간으로 확인할 수 있다. 대표적인 도구로는 rqt_consolerqt_logger_level이 있으며, 이를 통해 로그 메시지를 실시간으로 확인하고, 로그 레벨을 동적으로 조정할 수 있다.

rqt_console

rqt_console는 ROS2에서 발생하는 로그 메시지를 실시간으로 표시하는 GUI 기반의 도구이다. 이를 통해 노드에서 발생하는 로그 메시지를 편리하게 모니터링하고, 시스템 상태를 쉽게 파악할 수 있다. rqt_console는 다양한 필터링 옵션을 제공하여, 특정 노드나 특정 레벨의 로그만을 선택적으로 표시할 수 있다.

rqt_console

rqt_logger_level

rqt_logger_level은 각 노드의 로그 레벨을 실시간으로 조정할 수 있는 도구이다. 이를 통해 디버깅 과정에서 로그 레벨을 동적으로 변경하고, 필요한 로그 메시지만을 선택적으로 출력할 수 있다. 예를 들어, 특정 노드에서만 Debug 로그를 활성화하고, 다른 노드에서는 Info 레벨 로그만 출력하도록 설정할 수 있다.

rqt_logger_level

이 도구는 특히 복잡한 시스템에서 로그 레벨을 유연하게 관리할 수 있어 디버깅 효율성을 크게 향상시킨다.