8

我正在使用 Pythonslogging模块。我想记录消息的完整路径,例如
“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,
    },
}

}

我得到一个这样的记录器:

logger = logging.getLogger('develop')
4

6 回答 6

5

我不知道如何像 Java 默认那样获取“包名”,但要添加文件名(它为您提供同样多的上下文),%(pathname)s请在您的格式字符串中使用:

'format': '[%(levelname)s] %(message)s [%(pathname)s %(funcName)s %(lineno)d]'

请参阅此处的文档:https ://docs.python.org/2/library/logging.html#logrecord-attributes

于 2016-12-22T01:03:04.273 回答
3

我建议使用 生成包的记录器logging.getLogger(__name__.split('.')[0]),使用包含name参数的格式化程序对其进行配置,然后使用 生成模块的记录器logging.getLogger(__name__)

例如:

import logging

formatter = logging.Formatter('%(name)s - %(message)s')
handler = logging.StreamHandler()
handler.setFormatter(formatter)
handler.setLevel(logging.INFO)

package_logger = logging.getLogger(__name__.split('.')[0])
package_logger.setLevel(logging.INFO)
package_logger.addHandler(handler)

logger = logging.getLogger(__name__)
logger.info('message')

对于module.py位于名为 的包内的模块packagelogger.info()调用应生成以下消息STDERR

package.module - message

在同一个包内的其他模块中,您可以简单地设置您的记录器,如下所示以获得类似的功能:

import logging

logger = logging.getLogger(__name__)

logger.info('another message')

对于another.pypackage 内部的模块,从同一包的模块package调用module.py,这应该生成以下文本STDERR

package.another - another message
于 2018-02-26T20:04:04.857 回答
2

我看到了解决这个问题的两种方法。

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

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

于 2012-04-18T09:29:05.697 回答
2

我在一个名为 common 的包中有一个 utils.py 文件,它具有以下内容。

实用程序.py

import logging
log = logging
log.basicConfig(level=log.INFO, format='%(asctime)s:%(filename)s:%(funcName)s'
                                       ':%(levelname)s :%(message)s')

在我需要使用日志的任何其他文件中,我使用以下内容。

from pkg.common.utils import log
log.info("some msg")
于 2020-05-25T01:44:10.067 回答
1

这是我如何实现的示例: https ://github.com/JensTimmerman/vsc-base/blob/master/lib/vsc/utils/fancylogger.py

正如西蒙建议的那样,我扩展到 python 记录器以添加自定义字段。但是您也可以只定义一个新的 getLogger 函数来执行此操作:

rootmodulename = inspect.stack()[-1][1].split('/')[-1].split('.')[0]
callingfunctionname = inspect.stack()[2][3]
logger = logging.getLogger("%s.%s" % (rootmodulename, callingfunctionname))

但是请查看 fancylogger.py 以获得完整的示例。

于 2012-08-31T14:30:20.833 回答
0

只需按照https://docs.djangoproject.com/en/2.2/topics/logging/的说明将样式“{”与 {module} 一起使用

例子:

'formatters': {
    'standard': {
        'format': '{asctime}: [{levelname}] [{name}] [{module}.{funcName} linenr: {lineno}]: {message}',
        'style': '{',
    },
    'report': {
        'format': '{asctime}: [{name}.{module}.{funcName} linenr: {lineno}]: {message}',
        'style': '{',
    },
    'simple': {
        'format': '{levelname} {message}',
        'style': '{',
    },
},
于 2019-04-05T14:04:09.410 回答