繁体   English   中英

使用Python,ROS和C ++记录

[英]Logging with Python, ROS, and C++

我有Python和C ++代码的代码库,其中包括大量使用ROS。 使用系统记录器rospy记录 在整个Python代码中进行记录 -人为的示例:

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配置(如本日志最佳实践中所述,我可以为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]

您可以使用rospy.loginfo()对ROS-Python和制造ROS_INFO()是由ROS-C ++的和他们在一个场景整合。 为此,请执行以下操作:

$ roscd log

您将看到几个.log文件,然后使用以下命令对其进行跟踪。

$ tail -f <logfile-name.log>

[ 更新 ]
另外,您可以订阅/rosout主题或回显该主题( $ rostopic echo /rosout )。
参考


这个配置yaml可以解决这个问题:

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

loggers:
    __main__:
        level: DEBUG
        handlers: [console]
        propagate: no
    rosout:
        level: INFO
        propagate: yes
        qualname: rosout

root:
    level: INFO
    handlers: [console, info_file_handler]

并加载它,

import logging
import yaml

if os.path.exists(config_path):
    with open(config_path, 'rt') as f:
        config = yaml.safe_load(f.read())
    logging.config.dictConfig(config)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM