我正在使用Pythonslogging
模块。我想记录消息的完整路径,比如
“msg package name.modulename.functionName行号”,但如何获取消息的包名称?
日志记录配置为:
LOGGING = {
'formatters': {
'simple': {
'format': '[%(levelname)s] %(message)s [%(module)s %(funcName)s %(lineno)d]'
},
},
'handlers': {
'console': {
'level':'INFO',
'class':'logging.StreamHandler',
'formatter':'simple',
}
},
'loggers': {
'develop': {
'handlers': ['console'],
'level': 'DEBUG',
'propagate': True,
},
}
}
我有一个这样的记录器:
logger = logging.getLogger('develop')
我建议使用
logging.getLogger(__name__.split('.')[0])
生成包的记录器,使用包含name
参数的格式化程序配置它,然后使用logging.getLogger(__name__)
生成模块的记录器。例如:
对于位于名为
package
的包内的模块module.py
,logger.info()
调用应生成以下消息给STDERR
:在同一个包中的其他模块中,您可以简单地按照以下步骤设置记录器,以获得在其中工作的类似功能:
对于从同一包的
module.py
模块调用的包another.py
内的模块package
,这将生成STDERR
的以下文本:我看到了两个解决问题的办法。
首先,在每次调用log.[debug,info,error,…]时传入文件名,这是由
__file__
魔术变量获得的。这并没有提供包的名称,但它与查找日志消息的来源一样好。缺点是需要修改应用程序中的每个日志记录调用。第二,生成
logging.Logger
的子类,该子类重写Logger.log
实例方法。在新的log
方法中,使用inspect.stack()
和inspect.getframeinfo()
方法查找导致在代码中调用log
的堆栈帧,并提取文件名和行号。然后可以相应地修改传入的日志消息。最后,告诉logging
模块通过调用logging.setLoggerClass()
来使用子类。下面是我如何实现这一点的示例: https://github.com/JensTimmerman/vsc-base/blob/master/lib/vsc/utils/fancylogger.py
正如Simon所建议的,我扩展到python记录器来添加自定义字段。 但您也可以定义一个新的getLogger函数来执行以下操作:
但看看fancylogger.py就可以得到一个完整的示例。
相关问题 更多 >
编程相关推荐