0

原始问题

我有一个包qualysapi,我已经成功实现了包级日志记录,但我正在寻找对用户透明的模块级粒度。我从这个解决方案中模拟了我的实现:

跨包模块设置日志记录的有效方法

我希望为利用该类添加该记录器的“用户”模块实现包级日志记录。我相信用户模块应该只需要添加包名,而不必知道包中包含的模块。

以下是我到目前为止的内容(简化):

包/____init____.py:

from package_name.util import connect

包/util.py:

import logging
import package_name.module_class

logger = logging.getLogger(package_name)

def connect():
    return module_class.ClassName()

包/module_class.py:

class ClassName:
    def __init__(self):
        package_name.util.logger.info("Created instance.")

用户.py:

import logging
import package_name

# My logging.
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# Log package_name.
logger_pkg = logging.getLogger('package_name')
logger.addHandler(logger_pkg)
# Define a Handler which writes to the sys.stderr.
logger_console = logging.StreamHandler()
logger.addHandler(logger_console)

我很想知道在允许模块级包日志记录的同时保持用户易用性的最佳实践。

更新 1

我做错了。将问题改为应该发生的事情。

如何设置具有多个模块的包,以便用户只需为该包的所有模块的所有记录器处理程序添加包名称?下面的示例用户模块:

import logging, package_name
logger = logging.getLogger(__name__)
logger_pkg = logging.getLogger('package_name')
logger.addHandler(logger_pkg)
4

1 回答 1

0

最佳做法是遵循日志记录教程中所说的内容:

命名记录器时使用的一个好的约定是在每个使用记录的模块中使用模块级记录器,命名如下:

logger = logging.getLogger(__name__)

这意味着记录器名称跟踪包/模块层次结构,并且仅从记录器名称记录事件的位置很直观。

然后你做例如

logger.debug('Message with %d %s', 2, 'arguments')

整个模块。该方法还允许您的库的用户为特定模块调高/调低详细程度。

您描述的方法似乎有些复杂,但也许您有充分的理由这样做。

如果出于某种原因您不能采用本教程中给出的方法,请对此答案发表评论,让我知道它是什么。

于 2013-07-11T21:02:11.970 回答