【问题标题】:Efficient way of setting Logging across a Package Module跨包模块设置日志记录的有效方法
【发布时间】:2011-03-21 21:48:14
【问题描述】:

我有一个包,其中包含多个组件,这些组件将从使用日志记录和输出有用信息中受益匪浅。

我不想做的是为每个文件“设置”正确的日志记录,其中包括以下几行:

import logging
logging.basicConfig(level=DEBUG)
my_function = logging.getLogger("my_function")
my_class = logging.getLogger("my_class")

我尝试了几种方法,其中一种是将样板代码添加到实用程序模块中的类中,然后尝试执行以下操作:

from util import setlogging
set_logging()

但即使是上述解决方案对我来说也不干净,并且会导致问题,因为 setLogger 没有__call__ 方法。我喜欢的是我的“set_logging”类会从配置文件中读取并具有一些默认值,因此无论我想要什么级别或什么类型的日志记录格式都可以正确设置它。

有没有办法在我的包中全面初始化正确的日志记录?也许在__init__.py 文件中?

为了尽可能详细,这就是 setlogging(现在是一个函数,而不是一个类)的样子:

def setlogging(config=None):
    if config == None:
        config = config_options() # sets default values
    levels = {
        'debug': DEBUG,
       'info': INFO
        }

    level = levels.get(config['log_level'])
    log_format = config['log_format']
    datefmt = config['log_datefmt']

    basicConfig(
        level   = level,
        format  = log_format,
        datefmt = datefmt)

【问题讨论】:

    标签: python logging module package


    【解决方案1】:

    如果您希望包的各个模块中的所有代码都使用相同的记录器对象,您只需要(使该记录器可用 - 见下文 - 并)调用

    mylogger.warning("Attenzione!")
    

    之类的,而不是logging.warning &c。因此,问题减少到为整个包创建一个mylogger 对象,并使其在包中的所有模块中都可用。 (或者,您可以使用命名记录器,其名称以包名开头,后跟一个点,但是虽然这在很大程度上是 logging 包功能的一部分,但我个人从未发现它是一种自然的操作方式。

    所以,你的util.setlogging 函数可以简单地跟在后面,比如说,

    mylogger = logging.getLogger(package_name)
    

    每个导入util的模块都可以简单地使用

    util.mylogger.warning('Watch out!')
    

    之类的。在我看来,这似乎是最简单的方法,只要包中的所有代码都应该以相同方式登录的概念适用。

    【讨论】:

    • 难道我还需要调用 setlogging() 才能访问 'mylogger' 吗?即使我尝试了,我仍然得到一个预期的 AttributeError,因为“函数”对象没有属性“mylogger”。也许我没有完全了解图片......
    • @alfredo,它只需要被调用一次(来自包的__init__.py 将是最简单的使用点,因为你知道它总是在任何模块中的任何代码之前运行包),当然您可以向该记录器添加一个处理程序,并根据您的需要配置其格式化程序,如docs.python.org/library/… 给出的示例代码中所示。
    • 谢谢亚历克斯,这真的很有帮助!明年我会在 PyCon 上给你买啤酒 :)
    • @alfredo,指望它——那么在圣何塞见!-)
    • Pycon 是本周。我欠你一杯啤酒。你是名人。这会发生吗? :)
    【解决方案2】:

    模块使用日志的正确方式是

    import logging
    logger = logging.getLogger('my_module_name')
    

    logger.debug('help!')
    

    在有人调用logging.basicConfig()(或变体)之前变为无操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-28
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 2015-01-13
      • 2019-01-16
      相关资源
      最近更新 更多