如何在Python中记录软件包名称?

rem*_*emy 5 python logging

我正在使用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)

don*_*man 5

我不知道如何像 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


Sim*_*mon 2

我看到这个问题有两种解决方案。

一,在每次调用 log.[debug,info,error,...] 时传入由__file__magic 变量获取的文件名。这不会为您提供包名称,但它与查找日志消息的来源一样好。缺点是您需要修改应用程序中的每个日志记录调用。

第二,创建一个logging.Logger覆盖Logger.log实例方法的子类。在您的新log方法中,使用inspect.stack()inspect.getframeinfo()方法查找导致log代码中调用的堆栈帧并提取文件名和行号。然后您可以相应地修改传入的日志消息。最后,logging通过调用 告诉模块使用您的子类logging.setLoggerClass()