get_logger, 로그 레벨, rqt_console
print 대신 get_logger를 쓰는 이유는 무엇일까?
get_logger
누가, 언제, 얼마나 중요한지
self.get_logger()는 노드의 로거(logger)를 돌려줍니다. 로거로 남긴 한 줄에는 레벨, 시각, 노드 이름이 함께 붙습니다. 노드가 여럿 돌 때 누가 무슨 말을 했는지 가릴 수 있습니다.
시각은 1970년부터 센 초입니다. 그림의 값은 예시입니다.
다섯 레벨
DEBUG부터 FATAL까지 다섯 단계
로그 레벨(log level)은 그 로그가 얼마나 심각한지를 나타냅니다. rclpy 로거는 레벨마다 메서드가 있습니다. 평소 진행은 info(), 이상한 일은 warning(), 실패는 error()로 남깁니다.
기본은 INFO
기준보다 낮은 로그는 안 보입니다
기본 레벨은 INFO라서 debug()로 남긴 로그는 찍히지 않습니다. 실행할 때 --ros-args --log-level debug를 붙이면 DEBUG까지 보입니다. 반대로 WARN으로 올리면 INFO가 숨습니다.
내 노드만 낮추려면 --log-level talker:=debug처럼 로거 이름을 붙입니다.
/rosout
로그는 /rosout으로도 모입니다
노드가 남긴 로그는 터미널에 찍히는 동시에 /rosout 토픽으로도 발행됩니다. 그래서 여러 터미널에 흩어진 로그를 한곳에서 모아 볼 수 있습니다. 그 일을 하는 화면 도구가 rqt_console입니다.
/rosout은 3강 3편의 ros2 topic list에서 본 그 토픽입니다.
따라 하기
rqt_console로 모아 봅니다
새 터미널에서 ros2 run rqt_console rqt_console로 창을 띄우고, turtlesim을 켭니다. 3강 6편의 ros2 topic pub로 거북이를 벽 쪽으로 계속 몰면, 벽에 부딪혔다는 Warn 로그가 계속 쌓입니다.
공식 튜토리얼은 ros2 topic pub -r 1 /turtle1/cmd_vel로 linear.x를 2.0으로 보냅니다.
걸러 보기
레벨과 글자로 걸러 봅니다
rqt_console 가운데 칸에서는 보지 않을 레벨을 빼고(exclude), 아래 칸에서는 글자가 든 줄을 강조합니다(highlight). 로그가 많아도 문제가 된 노드와 레벨만 남겨 볼 수 있습니다.
rqt_console은 ros-jazzy-desktop에 함께 들어 있습니다. 창 모양은 줄여 그렸습니다.
다음 편