// This program periodical ly generates log messages at
// various severity levels .
#include <ros/ros.h>
int main (int argc,char **argv)
{
// Initialize the ROS system and become a node .
ros::init(argc, argv, "count_and_log");
ros::NodeHandle nh;
// Generate log messages of varying severi ty regularly .
ros::Rate rate (10);
for(int i=1; ros::ok(); i++)
{
ROS_DEBUG_STREAM("Counted?to?"<<i);
if((i%3)==0)
{
ROS_INFO_STREAM(i<<"?is?divisible?by?3.");
}
if((i%5)==0)
{
ROS_WARN_STREAM(i<<"?is?divisible?by?5.");
}
if((i%10)==0)
{
ROS_ERROR_STREAM(i<<"?is?divisible?by?10.");
}
if((i%20)==0)
{
ROS_FATAL_STREAM(i<<"?is?divisible?by?20.");
}
rate.sleep();
}
}
1.普通的日志输出
总共有五个基本的
C++
宏用来产生日志消
息,其中每个宏对应一个严重级别:
ROS_DEBUG_STREAM(message);
ROS_INFO_STREAM(message);
ROS_WARN_STREAM(message);
ROS_ERROR_STREAM(message);
ROS_FATAL_STREAM(message);
其中各个宏的参数
message
可以处理
C++
中标准输出流(
ostream
)
中的各种表达式
2.格式输出函数(printf)的日志
如果你更喜欢用格式输出函数(
printf
)风格的接口来替换
C++
风格的流,
ROS
还提供了不带
_STREAM
后缀的宏。比如,
宏
ROS_INFO(format, …)
可以生成
INFO
级别的日志消息。只要你熟悉
printf
,这些
宏将按照你的期望工作。一个具体的例子是,表
3.4
中的
代码大致等价于:
ROS_INFO(“Position=(%0.2f, %0.2f) direction=%0.2f”, msg.x,
msg.y, msg.theta);
3.
生成一次性日志消息
OS
提供了可以仅仅生成一次日志消息的简单
的宏。
ROS_DEBUG_STREAM_ONCE(message);
ROS_INFO_STREAM_ONCE (message);
ROS_WARN_STREAM_ONCE (message);
ROS_ERROR_STREAM_ONCE (message);
ROS_FATAL_STREAM_ONCE (message);
在循环中就第一次执行打印,后续执行无效
4.生成频率受控的日志消息
还有一些宏可以用来控制日志消息
出现的频率。
ROS_DEBUG_STREAM_THROTTLE(interval, message);
ROS_INFO_STREAM_THROTTLE(interval, message);
ROS_WARN_STREAM_THROTTLE(interval, message);
ROS_ERROR_STREAM_THROTTLE(interval, messge);
ROS_FATAL_STREAM_THROTTLE(interval, message);
参数
interval
是
double
类型的,它表示以秒为单位的时间量,这
是相邻日志消息出现的最小时间间隔。
ROS_..._STREAM_THROTTLE
宏的每一个实例在第一次执行时都会生成日志消息(与不带
_THROTTLE
后缀版本宏的日志消息相同),随后的执行都会被忽略,
直到经过了指定的时间间隔。每个宏的实例的时间被单独跟踪,
方法是使用一个局部静态变量来存储上一次生成日志的时间
查看日志
1.控制台
然而,需要注意的是,由于这两种流的缓存方式不同,
可能导致消息不按照顺序出现——在结果中
DEBUG
和
INFO
消息可能出现得比你预想的靠后。你可以使用
stdbuf
命令使标准输出采用行缓存方式,从而强制让消息按照正
常顺序输出:
stdbuf –oL command &> file
将其日志记录存于文件中
2. rosout 上的消息
由于
/rosout
只是一个普通的话题,你当然可以通过
rostopic echo /rosout
这条命令直接查看消息内容。如果你一定要坚持,甚至可以自己
写一个程序来订阅
/rosout
话题,以你自己喜欢的方式来显示或者
处理这些消息。然而,查看
/rosout
消息最简单的方式是使用下面
这条命令
5, 6
:
rqt_console
3.日志文件
日志消息的第三个,也是最后一个目的地,是由
rosout
节点
生成的日志文件。作为
/rosout
话题回调函数的一部分,该节点可
以将日志消息作为一行写入到一个日志文件,文件名类似于:
~/.ros/log/run_id/rosout.log
这里的
rosout.log
日志文件是纯文本文件。它可以利用
less
、
head
或者
tail
等命令行工具、或者是你喜欢的文本编辑器查看。运行
标识码(
run_id
)是一个通用唯一识别码(
UUID
),它在节点管理
器开始运行时基于你计算机的
MAC
地址和当前的时间生成。下面
是一个
run_id
的例子:
57aa1860-d765-11e2-a830-f0def1e189cc
使用这类唯一标识码,可以区分来自不同
ROS
会话的日志文件。
查找运行标识码
至少有两种简单方法可以查看当前会话的
run_id
通过检查
roscore
生成的输出,在靠近输出末端的位置,可以
看到与下面内容类似的一行
setting /run_id to run_id
通过以下命令向节点管理器询问当前的
run_id
rosparam get /run_id
由于
run_id
存放在参数服务器上,因此该命令是有效的。
查看和删除日志文件
可以使用下面这条命令来查看当前账户中被
ROS
日志消
耗的硬盘空间
7
:
rosclean check
如果日志正在消耗过多的硬盘空间,可以通过下面的命令删除所
有已经存在的日志:
rosclean purge
如果你愿意,也可以手动删除这些日志文件
日记级别设置
待完善