Last update:
아래와 같은 ros2 노드가 있다. 한 번은 ros2의 로거로 로깅을 하고, 한 번은 print()로 로깅을 하는 노드이다.
import rclpy
from rclpy.node import Node
class MyNode(Node):
def __init__(self):
super().__init__('my_node')
self.get_logger().info('log from ros2 logger!')
print('===== log from print =====') # not printed
def main():
rclpy.init(args=None)
my_node = MyNode()
rclpy.spin(my_node)
my_node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
Python
복사
ros2 run 명령어로 실행을 해보면 아래와 같이 두 줄이 모두 로깅이 된다.
$ ros2 run my_package my_node
[INFO] [1744080167.065278666] [my_node]: log from ros2 logger!
===== logging from print =====
Shell
복사
똑같은 노드를 launch 파일에서 실행해보자.
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
my_node = Node(
package='my_package',
executable='my_node',
output='screen'
emulate_tty=False
)
return LaunchDescription([my_node])
Python
복사
아래처럼 print()로 찍은 로그는 출력되지 않는 것을 볼 수 있다.
$ ros2 launch my_package my_launch.py
[INFO] [launch]: All log files can be found below /home/ubuntu/.ros/log/2025-04-08-02-44-51-866341-docker-desktop-2585
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [my_node-1]: process started with pid [2598]
[my_node-1] [INFO] [1744080293.674119126] [my_node]: log from ros2 logger!
Shell
복사
~/.ros/log 디렉터리로 가서 저장된 로그를 출력해보자
$ cd ~/.ros/log
$ ls
2025-04-08-02-46-35-600236-docker-desktop-2870 python3_2889_1744080396990.log
$ cd 2025-04-08-02-46-35-600236-docker-desktop-2870/
$ ls
launch.log
$ cat launch.log
1744080395.6008389 [INFO] [launch]: All log files can be found below /home/ubuntu/.ros/log/2025-04-08-02-46-35-600236-docker-desktop-2870
1744080395.6009448 [INFO] [launch]: Default logging verbosity is set to INFO
1744080395.7075284 [INFO] [my_node-1]: process started with pid [2889]
1744080397.2635176 [my_node-1] [INFO] [1744080397.263281169] [my_node]: log from ros2 logger!
Shell
복사
역시 print()로 찍은 로그는 출력되지 않았다. emulate_tty 옵션이 False이기 때문이다.
이런 식으로 실험한 output과 emulate_tty 옵션에 따른 결과를 정리하면 아래와 같다.
output | emulate_tty | ||||
log (default) | False | ||||
log | True | ||||
screen | False (default) | ||||
screen | True | ||||
both | False | ||||
both | True |
아래와 같은 사실을 확인할 수 있다.
•
ros2 logger는 output의 log 옵션과 both 옵션이 똑같이 동작한다.
•
stdout(print())은 emulate_tty=True일 때만 출력된다.
•
권장하지는 않지만, 굳이 stdout을 쓰고 싶다면 emulate_tty=True 옵션을 주자.