在像这样使用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
?
答案 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}}来创建日志消息;第二个将永远调用它,然后如果你不需要它就扔掉它。