대상: 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) |
|---|---|---|---|
| FATAL | ROS_FATAL() | 치명적 오류 (즉시 종료 수준) | ✅ 항상 |
| ERROR | ROS_ERROR() | 실행 중 오류 | ✅ |
| WARN | ROS_WARN() | 경고 | ✅ |
| INFO | ROS_INFO() | 일반 정보 | ✅ |
| DEBUG | ROS_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_package는my_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으로 관리
이렇게 세팅해두면, 디버깅 효율은 오르고 불필요한 로그 스트레스는 확 줄어듭니다. 🚀