我有Python和C++代码的代码库,其中包括大量使用ROS。整个Python代码都使用system logger和rospy logging进行记录-伪造的示例:
import logging
import rospy
logging.basicConfig(level=logging.INFO)
LOG = logging.getLogger(__name__)
def run():
rospy.loginfo("This is a ROS log message")
LOG.info("And now from Python")
if __name__ == '__main__':
runt()
对于C++代码,我们需要添加日志记录,可能需要添加glog,但是我愿意接受其他选择。
是否可以将各种记录器集成到一个模块中? 理想情况下,用户可以在后台执行
my_logger = AwesomeLogger(level='info', output='my_logs.txt')
之类的操作,然后在后台设置AwesomeLogger
来设置Python和C++记录器,并将所有日志输出(包括来自ROS的日志输出)组合到干净的控制台消息输出文本文件中。请注意,我们的目标是支持ubuntu 16.04,ROS-kinetic,C++ 11,Python 2.7 *
*如果解决方案提供了使用Python 3.6的合理性,您将获得加分!
更新
如果我从yaml加载dict配置(如this post on logging best practices中所述,我可以为ROS指定处理程序和记录器。但是,使用下面的yaml,我会向控制台获取重复的rospy日志消息,一种是标准rospy日志格式,另一种是我指定的格式,为什么?
version: 1
disable_existing_loggers: True
formatters:
my_std:
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
datefmt: "%Y/%m/%d %H:%M:%S"
handlers:
console:
class: logging.StreamHandler
formatter: my_std
level: DEBUG
stream: ext://sys.stdout
info_file_handler:
class: logging.handlers.RotatingFileHandler
level: INFO
formatter: my_std
filename: info.log
maxBytes: 10485760 # 10MB
backupCount: 20
encoding: utf8
rosconsole:
class: rosgraph.roslogging.RosStreamHandler
level: DEBUG
formatter: my_std
colorize: True
loggers:
my_module:
level: INFO
handlers: [console]
propagate: no
rosout:
level: INFO
handlers: [rosconsole]
propagate: yes
qualname: rosout
root:
level: INFO
handlers: [console, info_file_handler, rosconsole]
最佳答案
您可以使用为ROS-Python制作的rospy.loginfo()
和由ROS-C++制作的ROS_INFO()
并将它们集成到场景中。为此,请执行以下操作:
$ roscd log
您将看到几个
.log
文件,然后使用以下命令对其进行跟踪。$ tail -f <logfile-name.log>
[ UPDATE ]
另外,您可以订阅
/rosout
主题或回显此主题($ rostopic echo /rosout
)。Reference。