Answers:
该logging模块具有您想要的一切。乍一看似乎有些多余,但只使用您需要的零件。我推荐使用logging.basicConfig切换日志级别stderr和简单的日志方法,debug,info,warning,error和critical。
import logging, sys
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
logging.debug('A debug message!')
logging.info('We processed %d records', len(processed_records))
level在basicConfig通话中设置为logging.ERROR。
logging.basicConfig(stream=sys.stderr, level=logging.ERROR)将不起作用。重新启动内核并设置新级别是可行的,但这对我来说是一种解决方法。
一种简单的方法是调用日志记录函数:
DEBUG = True
def log(s):
if DEBUG:
print s
log("hello world")
然后,可以更改DEBUG有无日志记录的值并运行代码。
标准logging模块对此具有更完善的机制。
logging工作原理(非常简单的层次)。
首先,我将第二次提名python的日志记录框架。但是,请谨慎使用它。具体来说:让日志记录框架扩展您的变量,而不要自己做。例如,代替:
logging.debug("datastructure: %r" % complex_dict_structure)
确保您这样做:
logging.debug("datastructure: %r", complex_dict_structure)
因为尽管它们看上去很相似,但第一个版本即使已禁用也会产生repr()成本。第二个版本避免这种情况。同样,如果您自己动手,我建议采取以下措施:
def debug_stdout(sfunc):
print(sfunc())
debug = debug_stdout
通过以下方式调用:
debug(lambda: "datastructure: %r" % complex_dict_structure)
如果您通过执行以下操作将其禁用,这将再次避免开销:
def debug_noop(*args, **kwargs):
pass
debug = debug_noop
除非它们是1)计算成本高或2)debug语句处于n ^ 3循环之类的中间,否则计算这些字符串的开销可能并不重要。并不是说我对此一无所知。
我对其他人一无所知,但是我习惯于定义一个“全局常量”(DEBUG),然后定义一个仅在时才debug(msg)打印的全局函数()。msgDEBUG == True
然后,我编写如下的调试语句:
debug('My value: %d' % value)
...然后我进行单元测试,再也没有做过!:)
print()将我的代码提高到通过测试所需的级别只是几两遍。我print()到处都没结束过。日志记录也很酷!:)