rosout, rosconsole code reading

资源链接

使用

在程序中我们可以使用ros提供的log函数输出信息,或者使用 printf/cout 系列函数直接向stdout/stderr 输出信息。根据wiki描述,这些信息会出现如下这些位置:

  • stdout
  • stderr
  • Node log file
  • /rosout topic

日志相关配置参数

roslaunch --screen

1
--screen              Force output of all local nodes to screen

默认条件下,roslaunch会把node process stdout/stderr 重定向到磁盘文件,文件名格式为 XXXX-[stdout|stderr].log。如果使用该参数,则不重定向。

该参数默认在launch文件中必选:

1
2
3
4
5
<node
name="NODE_NAME"
pkg="PACKAGE_NAME"
type="TYPE"
output="log|screen">

参考代码:ros_comm/tools/roslaunch/src/roslaunch/nodeprocess.py::LocalProcess::_configure_logging()

log4cxx config file.

roscpp环境下,ros log函数底层提供了三种不同的实现: log4cxx, google log, console output。在package编译时选择确定。

在选择使用log4cxx的情况下,可以通过 env::ROS_ROOT/config/rosconsole.config 或者 env::ROSCONSOLE_CONFIG_FILE 指定log4cxx库接受的配置文件。

初始化时,log4cxx impl 默认添加一个 ROSConsoleStdioAppender,因此日志会向 stdout/stderr 输出。node开发者可以添加多个appender。

若果使用 google log impl,或者 console output impl,日志也会向stdout/stderr输出,与log4cxx的区别是只能额外注册一个appender,并且会被RosoutAppender占用,因此node 开发者无法额外添加。

参考代码:ros_comm/tools/rosconsole/src/rosconsole/impl/

ros::init(init_options::NoRosout)

Note that until the node is fully started, messages will not be sent, so you may not see initial messages.

根据wiki我们可以在/rosout topic中查看使用log函数输出的日志,但需要node完全启动后。

该输出方式通过向 rosconsole(roscpp环境下)注册 ROSOutAppender 实现。该过程实现在 ros::start() 函数中,默认会被NodeHandle构造函数调用。

参考代码:ros_comm/clients/roscpp/src/libros/init.cpp

代码分析

  • roscosole
    提供client端使用的log函数,及相关的初始化函数。
  • rosout
    订阅/rosout topic,处理消息,写入 rosout.log。