一、前言
在使用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")