使用多个模块的Python包 - 如何实现对用户来说容易的日志记录?

时间:2013-07-11 19:19:36

标签: python class logging module package

原始问题

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

Efficient way of setting Logging across a Package Module

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

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

包/ ____ 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.")

user.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)

1 个答案:

答案 0 :(得分:0)

最佳做法是遵循logging tutorial中的内容:

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

logger = logging.getLogger(__name__)

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

然后你做了。

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

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

你所描述的方法似乎有点令人费解,但也许你有充分的理由这样做。

如果由于某种原因您无法采用本教程中给出的方法,请对此答案发表评论以告诉我它是什么。