警告
您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.
记录
参见 日志页面 了解可用功能的详细信息。
在代码中使用日志语句
基本日志记录
以下代码将从 ROS 2 节点输出日志信息,该节点位于 DEBUG
严重性:
// printf 风格
RCLCPP_DEBUG(网站->;get_logger(), "我的日志信息 %d";, 4);
// C++ 流风格
rclcpp_debug_stream(网站->;get_logger(), "我的日志信息"; <<; 4);
网站.get_logger().排错('我的日志信息 %d' % (4))
请注意,这两种情况下都不添加尾部换行符,因为日志基础设施会自动添加尾部换行符。
仅首次登录
以下代码将从 ROS 2 节点输出日志信息,该节点位于 信息
严重性,但仅限于第一次撞击:
// printf 风格
rclcpp_info_once(网站->;get_logger(), "我的日志信息 %d";, 4);
// C++ 流风格
rclcpp_info_stream_once(网站->;get_logger(), "我的日志信息"; <<; 4);
木 = 4
网站.get_logger().信息(f'我的日志信息 {木}', 一次=正确)
除第一次外的所有记录
以下代码将从 ROS 2 节点输出日志信息,该节点位于 警告
严重性,但不是第一次被击中:
// printf 风格
rclcpp_warn_skipfirst(网站->;get_logger(), "我的日志信息 %d";, 4);
// C++ 流风格
rclcpp_warn_stream_skipfirst(网站->;get_logger(), "我的日志信息"; <<; 4);
木 = 4
网站.get_logger().警告('我的日志信息 {0}'.格式(木), skip_first=正确)
记录受阻
以下代码将从 ROS 2 节点输出日志信息,该节点位于 错误
严重程度,但每秒不得超过一次。
指定报文之间毫秒间隔的间隔参数应为整数数据类型,以便将其转换为 rcutils_duration_value_t
(一个 int64_t
):
// printf 风格
rclcpp_error_throttle(网站->;get_logger(), *网站->;获取时钟(), 1000, "我的日志信息 %d";, 4);
// C++ 流风格
rclcpp_error_stream_throttle(网站->;get_logger(), *网站->;获取锁定(), 1000, "我的日志信息"; <<; 4);
// 目前,使用 nanoseconds() 方法来使用现有的 rclcpp::Duration 值,请参见 https://github.com/ros2/rclcpp/issues/1929。
rclcpp_error_stream_throttle(网站->;get_logger(), *网站->;获取时钟(), msg_interval.纳秒()/1000000, "我的日志信息"; <<; 4);
木 = 4
网站.get_logger().错误(f'我的日志信息 {木}', 节流阀持续时间=1)
除第一次外,其他所有记录都被节流
以下代码将从 ROS 2 节点输出日志信息,该节点位于 DEBUG
严重性,每秒不超过一次,跳过第一次撞击:
// printf 风格
rclcpp_debug_skipfirst_throttle(网站->;get_logger(), *网站->;获取时钟(), 1000, "我的日志信息 %d";, 4);
rclcpp_debug_skipfirst_throttle(网站->;get_logger(), *网站->;获取时钟(), 1000, "我的日志信息"; <<; 4);
木 = 4
网站.get_logger().排错(f'我的日志信息 {木}', skip_first=正确, 节流阀持续时间=1.0)
记录演示
在此 演示可显示不同类型的日志调用,并可在本地和外部配置不同日志记录器的严重程度。
开始演示:
玫瑰2 运行 日志演示 日志_演示_主
随着时间的推移,您将看到各种不同属性的日志调用输出。开始时,您只能看到严重性为 信息
及以上 (警告
, 错误
, 致命
).请注意,第一条信息只会被记录一次,尽管每次迭代都会到达该行,因为这是用于该信息的日志调用的属性。
日志目录配置
日志记录目录可通过两个环境变量进行配置: ROS_LOG_DIR
和 ROS_HOME
.逻辑如下
使用
$ROS_LOG_DIR
如果ROS_LOG_DIR
已设置且不为空。否则,请使用
$ROS_HOME/log
使用~/.ros
对于ROS_HOME
如果未设置或为空。
例如,要将日志记录目录设置为 ~/my_logs
:
出口 ROS_LOG_DIR=~/my_logs ros2 运行 日志演示 日志_演示_主
出口 ROS_LOG_DIR=~/my_logs ros2 运行 日志演示 日志_演示_主
设置 "ROS_LOG_DIR=~/my_logs";
玫瑰2 运行 日志演示 日志_演示_主
然后,您可以在 ~/my_logs/
.
或者,您也可以设置 ROS_HOME
而日志记录目录将相对于该目录 ($ROS_HOME/log
).
ROS_HOME
的目的是供任何需要基本目录的文件使用。请注意 ROS_LOG_DIR
必须为未设置或空。例如 ROS_HOME
设为 ~/my_ros_home
:
出口 ROS_HOME=~/my_ros_home ros2 运行 日志演示 日志_演示_主
出口 ROS_HOME=~/my_ros_home ros2 运行 日志演示 日志_演示_主
设置 "ROS_HOME=~/my_ros_home";
玫瑰2 运行 日志演示 日志_演示_主
然后,您可以在 ~/my_ros_home/log/
.
记录仪级别配置:编程
重复 10 次后,记录仪的级别将设置为 DEBUG
会导致记录更多信息。
其中一些调试信息会导致额外的函数/表达式被评估,而这些函数/表达式之前会被跳过,因为 DEBUG
日志调用未启用。请参见 源代码 有关所用调用的进一步解释,请参阅演示中的 rclcpp 日志文档,了解所支持的日志调用的完整列表。
记录仪级别配置:外部
未来将有一种通用方法,用于在运行时对记录仪进行外部配置(类似于 rqt_logger_level ROS 1 允许通过远程程序调用配置记录仪)。 ROS 2 尚未正式支持这一概念。 同时,该演示提供了一个 范例 服务,该服务可从外部调用,要求为进程中已知名称的记录仪配置记录仪级别。
之前启动的演示程序已经在运行此示例服务。要将演示的日志记录器级别设回 信息
请拨打服务电话:
玫瑰2 服务 致电 /config_logger logging_demo/srv/ConfigLogger "{logger_name: 'logger_usage_demo', level:INFO}";
此服务调用适用于进程中运行的任何记录仪,前提是你知道其名称。这包括 ROS 2 内核中的日志记录器,如 rcl
(通用客户端库软件包)。要启用 rcl
, call:
玫瑰2 服务 致电 /config_logger logging_demo/srv/ConfigLogger "{logger_name: 'rcl', level:DEBUG}";
您应该能看到来自 rcl
开始显示。
使用记录仪配置组件
响应记录仪配置请求的服务器是作为一个组件开发的,因此可以添加到现有的基于组合的系统中。例如,如果您正在使用 运行节点的容器要配置记录仪,您只需请求它额外加载 logging_demo::LoggerConfig
组件放入容器中。
例如,如果要调试 构成::谈话者
演示时,您可以像往常一样启动通话器:
外壳 1:
玫瑰2 运行 rclcpp_components 组件容器
外壳 2:
玫瑰2 组成部分 负荷 /ComponentManager 构成 构成::谈话者
然后,当你想启用调试日志时,加载 记录仪配置
组成部分:
外壳 2
玫瑰2 组成部分 负荷 /ComponentManager 日志演示 logging_demo::LoggerConfig
最后,通过寻址空名日志记录器,将所有未设置的日志记录器配置为调试严重性。请注意,已特别配置为使用特定严重性的日志记录器不会受到此调用的影响。
外壳 2:
玫瑰2 服务 致电 /config_logger logging_demo/srv/ConfigLogger "{logger_name: '', level:DEBUG}";
你应该会看到进程中先前未设置的日志记录器开始出现调试输出,包括来自 ROS 2 内核的调试输出。
记录仪级别配置:命令行
从 Bouncy ROS 2 版本开始,可以通过命令行配置未明确设置严重性的日志记录器的严重性级别。使用以下命令行参数重新启动演示程序:
玫瑰2 运行 日志演示 日志_演示_主 --ros-args --日志级 排错
这会将任何未设置日志记录器的默认严重性配置为调试严重性级别。你应该能看到来自演示本身和 ROS 2 内核的日志记录器的调试输出。
可通过命令行配置单个记录仪的严重性级别。使用以下命令行参数重新启动演示程序:
玫瑰2 运行 日志演示 日志_演示_主 --ros-args --日志级 logger_usage_demo:=排错
控制台输出格式
如果需要更多或更少的冗长格式,可以使用 RCUTILS_CONSOLE_OUTPUT_FORMAT 环境变量。例如,要额外获取日志调用的时间戳和位置,请停止演示并在设置环境变量后重新启动:
出口 rcutils_console_output_format="[{严重性} {时间}] [{名称}]:{message} ({function_name}() at {file_name}:{line_number})";
出口 rcutils_console_output_format="[{严重性} {时间}] [{名称}]:{message} ({function_name}() at {file_name}:{line_number})";
# set "RCUTILS_CONSOLE_OUTPUT_FORMAT=[{severity} {time}] [{name}]:{message} ({function_name}() at {file_name}:{line_number})";
玫瑰2 运行 日志演示 日志_演示_主
您会看到以秒为单位的时间戳以及函数名、文件名和行号与每条信息一起打印出来。 时间 "选项仅在 ROS 2 Bouncy 版本中支持。
控制台输出着色
默认情况下,针对终端的输出是彩色的。如果要强制启用或禁用,可以使用 rcutils_colorized_output
环境变量。例如
出口 rcutils_colorized_output=0 # 1 为强迫
出口 rcutils_colorized_output=0 # 1 为强迫
# set "RCUTILS_COLORIZED_OUTPUT=0";
玫瑰2 运行 日志演示 日志_演示_主
你会发现调试、警告、错误和致命日志现在都没有着色。
备注
在 Linux 和 MacOS 中,强制着色输出意味着如果将输出重定向到文件,ansi 转义颜色代码就会出现在文件上。在 windows 中,着色方法依赖于控制台 API。如果强制着色,就会收到着色失败的警告。默认行为已检查输出是否为控制台,因此不建议强制着色。
控制台输出的默认数据流
在 Foxy 及其后续版本中,所有调试级别的输出默认都转到 stderr。可以通过设置 rcutils_logging_use_stdout
环境变量为 1
.例如
出口 rcutils_logging_use_stdout=1
出口 rcutils_logging_use_stdout=1
设置 "RCUTILS_LOGGING_USE_STDOUT=1";
行缓冲控制台输出
默认情况下,所有日志输出都是非缓冲的。您可以通过设置 rcutils_logging_buffered_stream
环境变量为 1。例如
出口 rcutils_logging_buffered_stream=1
出口 rcutils_logging_buffered_stream=1
设置 "RCUTILS_LOGGING_BUFFERED_STREAM=1";
那就跑吧
玫瑰2 运行 日志演示 日志_演示_主