我正在使用Pythons logging模块。我想记录一条消息的完整路径,例如
“ msg packagename.modulename.functionName lineNumber”,但是如何获取消息的软件包名称?
日志记录配置为:
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,
},
}
Run Code Online (Sandbox Code Playgroud)
}
我得到了这样的记录器:
logger = logging.getLogger('develop')
Run Code Online (Sandbox Code Playgroud)
我不知道如何像 Java 那样默认获取“包名”,但是要添加文件名(它为您提供尽可能多的上下文),请%(pathname)s在格式字符串中使用:
'format': '[%(levelname)s] %(message)s [%(pathname)s %(funcName)s %(lineno)d]'
Run Code Online (Sandbox Code Playgroud)
请参阅此处的文档:https : //docs.python.org/2/library/logging.html#logrecord-attributes
我看到这个问题有两种解决方案。
一,在每次调用 log.[debug,info,error,...] 时传入由__file__magic 变量获取的文件名。这不会为您提供包名称,但它与查找日志消息的来源一样好。缺点是您需要修改应用程序中的每个日志记录调用。
第二,创建一个logging.Logger覆盖Logger.log实例方法的子类。在您的新log方法中,使用inspect.stack()和inspect.getframeinfo()方法查找导致log代码中调用的堆栈帧并提取文件名和行号。然后您可以相应地修改传入的日志消息。最后,logging通过调用 告诉模块使用您的子类logging.setLoggerClass()。
| 归档时间: |
|
| 查看次数: |
5753 次 |
| 最近记录: |