ROS 로그 레벨과 rosconsole 설정으로 디버깅 효율 올리기

대상: ROS 노드의 로그를 체계적으로 관리하고, 디버깅할 때 필요한 정보만 깔끔하게 보고 싶은 개발자
환경: Ubuntu 20.04 + ROS Noetic (Melodic, Kinetic 동일)


1. 문제/주제 요약

ROS 노드 실행 시 터미널에 수많은 로그가 섞여 나옵니다.
[ INFO], [WARN], [ERROR], [DEBUG] 같은 메시지가 뒤섞이면서
디버깅해야 할 핵심 정보가 묻히는 경우가 많습니다.

ROS는 rosconsole이라는 강력한 로깅 프레임워크를 제공하며,
이를 적절히 설정하면 필요한 로그만 보면서 효율적으로 디버깅할 수 있습니다.


2. 원인/배경 설명

ROS의 로깅 시스템은 C++의 rosconsole (Python은 rospy.log*) 기반으로 동작합니다.
기본적으로 모든 로그가 /rosout 토픽으로 퍼블리시되며,
rqt_console, rosout 창, 터미널에서 동일한 로그를 확인할 수 있습니다.

하지만 기본 레벨(INFO)만 유지하면:

  • 디버깅 시 필요한 DEBUG 로그가 안 보이고
  • 정상 실행 중에는 불필요한 로그가 너무 많습니다.

따라서 상황에 맞게 로그 레벨을 바꾸거나,
rosconsole 설정 파일(.config)을 통해 패키지별로 로그 필터링을 설정해야 합니다.


3. ROS 로그 레벨 구조

ROS 로그는 총 5단계 레벨을 가집니다:

레벨매크로의미출력 여부(기본: INFO)
FATALROS_FATAL()치명적 오류 (즉시 종료 수준)✅ 항상
ERRORROS_ERROR()실행 중 오류
WARNROS_WARN()경고
INFOROS_INFO()일반 정보
DEBUGROS_DEBUG()디버깅용 세부 로그❌ (기본적으로 표시 안 됨)

Python에서는 동일하게 다음 함수를 사용합니다:

rospy.loginfo("...")
rospy.logwarn("...")
rospy.logerr("...")
rospy.logdebug("...")

4. 로그 출력 제어하기

(1) 터미널에서 로그 레벨 지정

노드 실행 시 다음과 같이 로그 레벨을 지정할 수 있습니다.

rosrun my_package my_node _log_level:=debug

하지만 ROS1에서는 이 방법보다 rosconsole 설정 파일을 이용하는 방법이 더 일반적입니다.


(2) rosconsole.config 파일로 로그 레벨 설정

1️⃣ 설정 파일 생성

홈 디렉터리 또는 패키지 내에 파일 생성:

nano ~/.ros/rosconsole.config

2️⃣ 패키지별 로그 레벨 지정

예시:

log4j.logger.ros=INFO
log4j.logger.ros.my_package=DEBUG
log4j.logger.ros.tf=ERROR

3️⃣ 적용 후 노드 실행

환경 변수로 경로 지정:

export ROSCONSOLE_CONFIG_FILE=~/.ros/rosconsole.config
roslaunch my_package my_launch.launch

💡 해석

  • ros.my_packagemy_package의 모든 노드 로그를 DEBUG로 출력
  • ros.tf는 TF 관련 로그를 ERROR 이상만 표시 (경고 숨김)

(3) 런치 파일에서 환경 변수 자동 지정

launch 파일 상단에 다음을 추가하면 매번 export하지 않아도 됩니다:

<launch>
  <env name="ROSCONSOLE_CONFIG_FILE" value="$(find my_package)/config/rosconsole.config"/>
  ...
</launch>

(4) 실행 중 로그 레벨 동적 변경

rqt_logger_level 플러그인을 통해 실행 중인 노드의 로그 레벨을 변경할 수 있습니다.

rqt_logger_level
  • 각 노드별로 DEBUG, INFO, WARN, ERROR, FATAL 선택 가능
  • /rosout 로그 토픽을 기반으로 즉시 반영

🎯 디버깅 시 DEBUG로 올려놓고, 안정화 후 INFO로 돌리는 식으로 사용하면 효율적입니다.


5. 로그 저장 및 관리

ROS 로그는 자동으로 다음 경로에 저장됩니다:

~/.ros/log/latest/

각 노드별로 로그 파일이 분리되어 저장되며,
roslaunch 실행 시 출력된 경로로 접근할 수도 있습니다.

로그 정리:

rosclean check   # 사용량 확인
rosclean purge   # 오래된 로그 삭제

6. 추가 팁 / 자주 하는 실수

  • DEBUG 로그 안 보일 때
    rosconsole.config가 적용되지 않았거나, ROSCONSOLE_CONFIG_FILE 환경변수가 누락된 경우입니다.
  • 패키지 이름 오타
    → 설정 파일에서 ros.<패키지명>은 실제 ROS 패키지명과 정확히 일치해야 합니다.
  • roslaunch 시 rosconsole 설정 무시
    → launch 파일 내 <env> 지정으로 확실히 고정하세요.
  • 로그를 파일로 따로 남기기 rosrun my_package my_node > node.log 2>&1 또는 rosbag record /rosout 으로 로그 메시지 토픽까지 기록 가능.

7. 정리

방법설명사용 시점
ROS_DEBUG(), ROS_INFO()코드 내 로그 출력 매크로노드 구현 시
rosconsole.config패키지별 로그 레벨 제어런타임 이전
rqt_logger_level실행 중 동적 조정디버깅 중
rosclean로그 파일 정리주기적 유지관리

📌 요약

  • ROS 로그는 rosconsole 기반으로 동작하며, 로그 레벨을 자유롭게 제어 가능
  • rosconsole.config로 패키지별/노드별 로그 레벨 세분화
  • rqt_logger_level로 실행 중 실시간 변경
  • 필요할 때만 DEBUG, 나머지는 INFO 또는 WARN으로 관리

이렇게 세팅해두면, 디버깅 효율은 오르고 불필요한 로그 스트레스는 확 줄어듭니다. 🚀

댓글 남기기