资源链接
使用
在程序中我们可以使用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。