日志和日志记录器配置例程 [待校准@7762]
有关可用功能的详细信息,请参见 the logging page 。 [待校准@7763]
本例程,不同类型的日志调用s显示和严重水平不同日志记录器s配置lo调用y和外部。 [待校准@7764]
使用以下命令启动例程: [待校准@7765]
ros2 run logging_demo logging_demo_main
随着时间的推移,您将看到具有不同属性的各种日志调用的输出。首先,您将只看到严重程度为 INFO
及以上 ( WARN
、 ERROR
、 FATAL
) 的日志调用的输出。请注意,第一条消息只会被记录一次,尽管每次迭代都到达该行,因为这是用于该消息的日志调用的属性。 [待校准@7766]
日志目录配置 [待校准@7767]
日志目录可以通过两个环境变量进行配置: ROS_LOG_DIR
和 ROS_HOME
。逻辑如下: [待校准@7768]
如果
ROS_LOG_DIR
设置为非空,则使用 “$ ROS_LOG_DIR”。 [待校准@7769]否则,使用 “$ ROS_HOME/log”,如果未设置或为空,则使用“ ~/.Ros'” 表示
ROS_HOME
。 [待校准@7770]
例如,要将日志目录设置为 “~/my_logs”: [待校准@7771]
export ROS_LOG_DIR=~/my_logs
ros2 run logging_demo logging_demo_main
export ROS_LOG_DIR=~/my_logs
ros2 run logging_demo logging_demo_main
set "ROS_LOG_DIR=~/my_logs"
ros2 run logging_demo logging_demo_main
然后,您将在 “~/my_logs/” 下找到日志。 [待校准@7772]
或者,您可以设置 ROS_HOME
,日志目录将与其相关 (“$ ROS_HOME/log”)。 ROS_HOME
旨在供任何需要基本目录的人使用。请注意, ROS_LOG_DIR
必须是未设置的或空的。例如,将 ROS_HOME
设置为 “~/my_ros_home”: [待校准@7773]
export ROS_HOME=~/my_ros_home
ros2 run logging_demo logging_demo_main
export ROS_HOME=~/my_ros_home
ros2 run logging_demo logging_demo_main
set "ROS_HOME=~/my_ros_home"
ros2 run logging_demo logging_demo_main
然后,您将在 “~/my_ros_home/log/” 下找到日志。 [待校准@7774]
日志记录器级别配置: 编程调用y [待校准@7775]
10次迭代后,日志记录器的级别将被设置为 DEBUG
,这将导致记录额外的消息。 [待校准@7776]
其中一些调试消息导致计算附加函数/表达式,这些函数/表达式之前在未启用 DEBUG
日志调用时被跳过。有关所使用调用的进一步说明,请参阅例程的 the source code ,有关支持的日志调用的完整列表,请参阅rclcpp日志文档。 [待校准@7777]
日志记录器级别配置: 外部 [待校准@7778]
在未来会有广义方法外部配置日志记录器s在运行时 (类似于 rqt_logger_level 在ROS 1允许日志记录器配置通过远程程序调用)。这一概念尚未在ROS 2中得到官方支持。同时,此例程提供了一个示例服务,可以从外部调用该服务,以请求为过程中已知的日志记录器名称配置日志记录器级别。 [待校准@7779]
先前启动的例程已经在运行此示例服务。要将例程的日志记录器级别设置回 INFO
,请使用以下命令调用服务: [待校准@7780]
ros2 service call /config_logger logging_demo/srv/ConfigLogger "{logger_name: 'logger_usage_demo', level: INFO}"
只要您知道其名称,此服务调用将适用于进程中运行的任何日志记录器。这包括ROS 2核心中的日志记录器,例如 rcl
(通用客户端库包)。要为 rcl
启用调试日志,请调用: [待校准@7781]
ros2 service call /config_logger logging_demo/srv/ConfigLogger "{logger_name: 'rcl', level: DEBUG}"
您应该会看到从 rcl
开始显示的调试输出。 [待校准@7782]
使用日志记录器配置组件 [待校准@7783]
响应日志记录器配置请求的服务器已被开发为组件,以便可以将其添加到现有的基于组合的系统中。例如,如果您使用 a container to run your nodes, 来配置日志记录器,您只需要请求它额外将 “日志 _ 例程::日志记录器配置” 组件加载到容器中。 [待校准@7784]
例如,如果要调试 “合成:: talker” 例程,则可以使用以下命令正常启动talker: [待校准@7785]
外壳1: [待校准@7786]
ros2 run rclcpp_components component_container
外壳2: [待校准@7787]
ros2 component load /ComponentManager composition composition::Talker
然后,当您想要启用调试日志时,使用以下命令加载 LoggerConfig
组件: [待校准@7788]
外壳2 [待校准@7789]
ros2 component load /ComponentManager logging_demo logging_demo::LoggerConfig
最后,通过寻址空命名的日志记录器,将所有未设置的日志记录器配置为调试严重性。请注意,已指定调用为使用特定严重性的日志记录器将不受此调用的影响。 [待校准@7790]
外壳2: [待校准@7787]
ros2 service call /config_logger logging_demo/srv/ConfigLogger "{logger_name: '', level: DEBUG}"
您应该会看到进程中任何先前未设置的日志记录器的调试输出开始出现,包括ROS 2核心。 [待校准@7791]
日志记录器级别配置: 命令行 [待校准@7792]
从Bouncy ROS 2版本开始,可以从命令行配置尚未明确设置其严重性的日志记录器的严重性级别。重新启动包含以下命令行参数的例程: [待校准@7793]
ros2 run logging_demo logging_demo_main --ros-args --log-level debug
这会将任何未设置的日志记录器的默认严重性配置为调试严重性级别。您应该可以从例程本身和ROS 2核心看到日志记录器的调试输出。 [待校准@7794]
从GalacticROS 2发布开始,可以从命令行配置单个日志记录器的严重性级别。重新启动包含以下命令行参数的例程: [待校准@7795]
ros2 run logging_demo logging_demo_main --ros-args --log-level logger_usage_demo:=debug
控制台输出格式 [待校准@7797]
如果您想要或多或少的详细格式,可以使用RCUTILS_CONSOLE_OUTPUT_FORMAT环境变量。例如,要另外获取日志调用的时间戳和位置,请停止例程,然后使用环境变量集重新启动它: [待校准@7798]
export RCUTILS_CONSOLE_OUTPUT_FORMAT="[{severity} {time}] [{name}]: {message} ({function_name}() at {file_name}:{line_number})"
export RCUTILS_CONSOLE_OUTPUT_FORMAT="[{severity} {time}] [{name}]: {message} ({function_name}() at {file_name}:{line_number})"
# set "RCUTILS_CONSOLE_OUTPUT_FORMAT=[{severity} {time}] [{name}]: {message} ({function_name}() at {file_name}:{line_number})"
ros2 run logging_demo logging_demo_main
您应该会看到以秒为单位的时间戳,以及随每条消息另外打印的函数名称、文件名和行号。* 只有在ROS 2弹性版本时才支持 time
选项。* [待校准@7799]
控制台输出着色 [待校准@7800]
默认情况下,当输出瞄准终端时,它会着色。如果要强制启用或禁用它,可以使用 RCUTILS_COLORIZED_OUTPUT
环境变量。例如: [待校准@7801]
export RCUTILS_COLORIZED_OUTPUT=0 # 1 for forcing it
export RCUTILS_COLORIZED_OUTPUT=0 # 1 for forcing it
# set "RCUTILS_COLORIZED_OUTPUT=0"
ros2 run logging_demo logging_demo_main
您应该看到调试、警告、错误和致命日志现在没有着色。 [待校准@7802]
注解
在Linux和MacOS中,强制彩色输出意味着如果将输出重定向到文件,则会出现ansi转义颜色代码。在windows中,着色方法依赖于控制台api。如果是被迫的,你会得到一个新的警告,说着色失败。默认行为已经检查输出是否是控制台,因此不建议强制着色。 [待校准@7803]
控制台输出的默认流 [待校准@7804]
在Foxy及更高版本中,默认情况下,所有调试级别的输出都将转到stderr。通过将 RCUTILS_LOGGING_USE_STDOUT
环境变量设置为 1
,可以强制所有输出转到标准输出。例如: [待校准@7805]
export RCUTILS_LOGGING_USE_STDOUT=1
export RCUTILS_LOGGING_USE_STDOUT=1
set "RCUTILS_LOGGING_USE_STDOUT=1"
线路缓冲控制台输出 [待校准@7806]
默认情况下,所有日志输出都是无缓冲的。您可以通过将 RCUTILS_LOGGING_BUFFERED_STREAM
环境变量设置为1来强制对其进行缓冲。例如: [待校准@7807]
export RCUTILS_LOGGING_BUFFERED_STREAM=1
export RCUTILS_LOGGING_BUFFERED_STREAM=1
set "RCUTILS_LOGGING_BUFFERED_STREAM=1"
然后运行: [待校准@7808]
ros2 run logging_demo logging_demo_main