避免检查记录器是否存在

时间:2014-11-21 21:10:44

标签: python logging nonetype

在像这样使用python登录时

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

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

3 个答案:

答案 0 :(得分:6)

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

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')

答案 1 :(得分:5)

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

答案 2 :(得分:2)

  

如果没有if语句,它可以避免调用logger.debug吗?

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

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

def logdebug(*args):
    if logger:
        logger.debug(*args)

logdebug('message')
logdebug('other message')

你可以做其他类似的技巧。例如,您可以创建一个具有logger = None方法的对象,而不是debug,而不是class Dummy(object): def debug(self, *args): pass logger = Dummy()

if

或者,更好的是,总是创建一个记录器并使用null处理程序配置它,或者最简单 - 只需将其日志记录级别设置为高于debug。


但请注意,这些都不会完全替换if logger: logger.debug(very_expensive_function()) logdebug(very_expensive_function()) 语句。例如,考虑一下:

very_expensive_function

如果您确实需要,第一个只会调用{{1}}来创建日志消息;第二个将永远调用它,然后如果你不需要它就扔掉它。