这是我对ROS官方ROS2教程的翻译,纯个人理解,对于文中的关键词汇或不确定的语句标注了原文,如有错误或翻译问题还请指出。
文章翻译并未按照逐句逐词的方式进行,而是加入了我的一些主观思考,不过原则上还是会以原文思路为主。
原文:https://index.ros.org/doc/ros2/Concepts/Logging/
日志与日志记录器配置
概述
当前支持日志功能的有:
- 客户端程序库(
rclcpp
和rclpy
)使用一个通用的日志库来提供:- 各种过滤器的日志调用
- 日志级别
- 与节点相关联的日志,可以自动的使用节点的名称和命名空间
- 终端输出
- 即将发布文件输出以及类似于
rosout
的的远程应用消息的功能
- 即将发布文件输出以及类似于
- 多级别的可编程配置
- 支持启动配置时的默认日志级别;即将发布运行时的配置文件和外部配置
日志记录器概念
日志消息是具有与DEBUG
,INFO
,ERROR
,FATAL
这些严重性级别相关的一些消息,这些严重性级别的严重性是升序排序的。
一个日志记录器只会处理高于指定选择的日志级别的日志消息。
每一个rclcpp
和rclpy
的节点具有一个与其相关的日志记录器,可以自动的使用节点的名称和命名空间。如果节点的名称被外部重映射为与源代码中定义的名称不同的其他名称,它将会在日志记录器名称中反映出来。没有所属节点的日志记录器也可以被创建,名字可以特殊指定。
日志记录器的名称能够表示层级关系,如果一个名为"abc.def"的日志记录器未设置严重性级别,则它将与它的父级日志记录器"abc"的级别一致,如果它的父级日志记录器的级别也没有设置,那么将会使用默认的日志记录器级别。当日志记录器"abc"的级别被改变时,所有它的子级日志记录器(比如"abc.def"或"abc.ghi.jkl")将受到影响,除非这些子级日志记录器的级别被明确设置过。
日志的使用
在C++中:
在Python中:
日志记录器的配置
命令行模式下配置默认严重性级别
在ROS2的Bouncy
版本中,日志记录器默认的严重性级别可以在命令行中配置,比如:
ros2 run demo_nodes_cpp listener__log_level:=debug
其中日志的名称不需要刻意关注。
这样的配置将会影响所有未明确配置一个特定的严重性级别的日志记录器。
即将发布针对特定日志记录器进行配置的命令行配置功能。
可编程配置独立的日志记录器
日志记录器也可以在开发代码中进行配置。现在,可以在代码中对独立的日志记录器严重性级别进行配置,比如:
在C++中:
rcutils_logging_set_logger_level("logger_name", RCUTILS_LOG_SEVERITY_DEBUG);
在Python中:
logger.set_level(rclpy.logging.LoggingSeverity.DEBUG)
rclpy.logging.set_logger_level('logger_name', rclpy.logging.LoggingSeverity.DEBUG)
日志记录器示例程序中提供了一个手动公开一个服务的示例,以便可以在外部配置日志记录器;
将来我们希望能够实现运行时配置日志记录器的能力,从而可以自动公开服务。
终端输出配置
默认情况下,终端输出的格式包含消息的严重性级别、日志记录器的名称以及日志消息。诸如文件名称、函数名称以及行号等日志信息也同样可以显示。自定义终端输出格式可以通过配置RCUTILS_CONSOLE_OUTPUT_FORMAT
环境变量来实现:详情可查看rcutils文档。由于rclcpp
和rclpy
均使用rcutils
进行日志记录,这将影响所有的C++和Python节点。