关于Python的logging库和rospy

一、前言

在使用ROS时,rospy中提供了日志函数rospy.loginfo()等来输出日志。但是,rospy.loginfo()等函数的输出文件已经在ros内部指定:如果没有修改过,所有ros节点的日志都被默认统一存储在~/.ros/log下。这样对大型系统来说不太方便,特别是在调试大项目中的一个单独模块的时候,难以把其他模块的日志输出全部关闭,想关注的数据混杂在大量数据中难以找到。
如果需要在python中输打印日志和输出日志文件,很容易就能搜索到logging这个库。以下是一些我搜到的有关logging库的介绍和教学:
Python日志库logging的使用技巧
Python中内置的日志模块logging用法详解
Python logging.handlers模块,RotatingFileHandler、TimedRotatingFileHandler 处理器各参数详细介绍
【Python】Logging模块简介 & 开启不同颜色日志输出
python的logging.config使用详解
python logging模块-写日志、log回滚
2020-12-13:Python日志模块中RotatingFileHandler(循环覆盖式日志处理)类的使用
在查看rospy.loginfo()函数定义后,我发现这个函数是用logging库实现的。也就是说,ROS Python中的日志模块实际上是对logging库的再次封装。pycharm 运行ros代码报错:WARNING: cannot load logging configuration file, logging is disabled这篇博客中解决问题的方法也说明了这一点。既然rospy.log*()也是logging库,那不使用rospy.log*()而是直接使用logging库,应当也不会引起rospy的bug。

二、任务描述

不使用rospy.log*()这个封装后的logging而是直接使用logging来输出日志,并保持熟悉的令人安心的rospy.log*()格式。

三、步骤

1.找到rospy.log的格式配置文件

一般来说,该文件路径为/opt/ros/noetic/etc/ros/python_logging.conf,注意ros版本号。如果这个路径下没有,就全局搜索python_logging.conf
复制该文件到想要的位置,不要放在系统目录中,方便修改。

2.修改格式配置文件

默认的python_logging.conf如下

[loggers]
keys=root, rosout

[handlers]
keys=fileHandler,streamHandler

[formatters]
keys=defaultFormatter

[logger_root]
level=INFO
handlers=fileHandler

[logger_rosout]
level=INFO
handlers=streamHandler
propagate=1
qualname=rosout

[handler_fileHandler]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=defaultFormatter
# log filename, mode, maxBytes, backupCount
args=(os.environ['ROS_LOG_FILENAME'],'a', 50000000, 4)

[handler_streamHandler]
class=rosgraph.roslogging.RosStreamHandler
level=DEBUG
formatter=defaultFormatter
# colorize output flag
args=(True,)

[formatter_defaultFormatter]
format=[%(name)s][%(levelname)s] %(asctime)s: %(message)s

修改注意事项:

  • 修改handler_fileHandler中的args的第一个参数为日志保存路径。
  • 修改logger的名字也就是key字段,以免和rospy中的同名logger冲突。
  • 根据其他个人需求,参考logging库教程修改

修改后的python_logging.conf应类似下面这样:

[loggers]
keys=mylogger, rosout

[handlers]
keys=fileHandler,streamHandler

[formatters]
keys=defaultFormatter

[logger_mylogger]
level=INFO
# 同时输出到文件和终端
handlers=fileHandler,streamHandler

[logger_rosout]
level=INFO
handlers=streamHandler
propagate=1
qualname=rosout

# 用于输出到文件
[handler_fileHandler]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=defaultFormatter
# log filename, mode, maxBytes, backupCount
args=('/home/your_user_name/your_log_filename.log','a', 50000000, 4)

# 用于输出到终端
[handler_streamHandler]
class=rosgraph.roslogging.RosStreamHandler
level=DEBUG
formatter=defaultFormatter
# colorize output flag
args=(True,)

[formatter_defaultFormatter]
format=[%(name)s][%(levelname)s] %(asctime)s: %(message)s
3.在代码中导入该配置文件开始使用
#导入库
import logging
import logging.config
# 加载日志配置
logging.config.fileConfig(config.LOGGING_CONF)
# 获取logger,参数为logger的名字
logger = logging.getLogger('mylogger')
# 输出日志消息
logger.debug("debug message")
logger.info("info message")
logger.warning("warning message")
logger.error("error message")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值