【问题标题】:Avoid check if logger exists避免检查记录器是否存在
【发布时间】:2015-01-20 03:11:13
【问题描述】:

当像这样在 python 中使用登录时

import logging
logging.basicConfig(level=logging.INFO)
logger = None
if <some condition>:
   logger = logging.getLogger(__name__)
... some code ...
logger.debug('message')

如果没有if 语句不存在,是否可以避免调用logger.debug

【问题讨论】:

    标签: python logging nonetype


    【解决方案1】:

    这不是您使用日志记录的方式:它完全没有抓住重点。关键是始终只记录日志,然后(在应用程序级别)适当地配置处理程序,以便它们记录或不记录调试级别。您的应用级配置甚至可以为每个模块中的记录器设置处理程序。有关详细信息,请参阅 Python 日志记录文档。

    【讨论】:

    • 您是对的,但有时您可能不想在应用程序中使用日志记录,因此没有应用程序级别。例如,在独立服务中使用登录。在这种情况下,记录器可能会重复,这是不希望的
    • 这种方法没有帮助,例如,如果您正在开发一个不应包含其自己的日志配置的库。消费者应用程序或客户端将安装该库,其日志语句将自动与客户端选择的日志配置一起使用。但是,您为图书馆本身的本地发展做了什么?您可能希望执行一段不应定义任何日志处理程序的代码,但仍会看到来自例如的输出。 log.warn。如果 Python 干净地默认为此使用基本记录器,那就太好了。
    【解决方案2】:

    您可以构造一个包装对象并在任何地方使用它:

    class LoggerWrapper(object):
    
        def __init__(self, logger):
            self.logger = logger
    
        def debug(self, *args, **kwargs):
            if self.logger is None:
                return
            self.logger.debug(*args, **kwargs)
    
    my_wrapper = LoggerWrapper(logger)
    my_wrapper.debug('message')
    

    话虽如此,这并不特定于 Python 的日志记录模块。任何变量 var 也可以是 None,在调用它的方法之前需要检查 (var.method())。

    始终定义记录器并通过记录配置/设置简单地禁用记录可能更容易。这样可以保持代码干净,所有记录器调用都会成功,但如果禁用特定记录器,则输出不会去任何地方。

    最后,您可以选择确实使用 if 语句,因为它本身并没有那么多代码:

    if logger:
        logger.debug('message')
    

    【讨论】:

      【解决方案3】:

      如果没有 if 语句不存在,是否可以避免调用 logger.debug?

      嗯,你可以(ab)使用if 表达式,或or 表达式,或其他各种东西,但除此之外,不是真的。

      但是,您始终可以编写包装函数:

      def logdebug(*args):
          if logger:
              logger.debug(*args)
      
      logdebug('message')
      logdebug('other message')
      

      你可以做其他类似的技巧。例如,您可以创建一个对象,该对象具有一个不执行任何操作的 debug 方法,而不是 logger = None

      class Dummy(object):
          def debug(self, *args): pass
      logger = Dummy()
      

      或者,更好的是,始终创建一个记录器并使用空处理程序对其进行配置,或者——最简单的——将其记录级别设置为高于调试。


      但请注意,这些都不会完全替代if 语句。例如:

      if logger:
          logger.debug(very_expensive_function())
      
      logdebug(very_expensive_function())
      

      如果您确实需要,第一个只会调用very_expensive_function 来创建日志消息;第二个总是会调用它,然后如果你不需要它就扔掉它。

      【讨论】:

        猜你喜欢
        • 2011-05-06
        • 2011-10-04
        • 2011-02-20
        • 2019-04-07
        • 1970-01-01
        • 2015-01-21
        • 2012-08-13
        相关资源
        最近更新 更多