2009-12-22 57 views

回答

37

您可以删除默认的处理程序,并重新登录这样的:

# if someone tried to log something before basicConfig is called, Python creates a default handler that 
# goes to the console and will ignore further basicConfig calls. Remove the handler if there is one. 
root = logging.getLogger() 
if root.handlers: 
    for handler in root.handlers: 
     root.removeHandler(handler) 
logging.basicConfig(format='%(asctime)s %(message)s',level=logging.DEBUG) 
+1

要逐字使用。如果你我 - 样试图重新使用以前的记录器实例化这样的:'记录= logging.getLogger(__ __名)',并尝试回路'logger.handlers'这是行不通的。 – 2013-07-03 17:11:10

+1

什么是“如果root.handlers:”好?迭代空序列不起作用。 root.handlers可能是一些其他的非序列错误值吗? (这不是我的系统上) – Sebastian 2014-01-20 21:12:33

+0

派上用场来到与AWS Lambda表达式调试日志记录问题。看起来他们在lambda引导过程中安装了一些名为'LambdaLoggingHandler'的处理程序。删除已安装的处理程序解决了问题。 – 2017-05-18 18:16:23

9

是的。

你已经要求记录一些东西。因此,日志记录必须制作默认配置。一旦日志记录配置好了......好吧......已经配置好了。

“随着配置的记录器对象, 下面的方法创建日志 消息:”

此外,你可以阅读有关创建处理程序来防止虚假记录。但是,这比实用的技术更糟糕。

这是一个窍门。

  1. 无模块可以做,除了在全球范围内logging.getlogger()要求任何东西。

  2. 只有if __name__ == "__main__":可以做日志记录配置。

如果您在模块中以全局级别进行日志记录,那么您可能会强制日志记录来编译它的默认配置。

不要任何模块在做全球logging.info。如果您绝对认为您必须在模块中具有全球级别的logging.info,则必须在之前配置日志进行导入。这导致看起来不愉快的脚本。

+1

不,我错了 - 显然,这是由设计basicConfig从.INFO等人打电话来确保安装了记录仪。它对我来说似乎仍然很古怪。 – 2012-07-06 06:59:41

2

下面是上面的回答并没有提及拼图...的一块,然后将所有的意义:在“根”记录 - 这,如果你打电话,说,logging.info()logging.basicConfig(水平= logging.DEBUG)之前被使用 - 有警告的默认日志记录级别。

这就是为什么logging.info()和logging.debug()不执行任何操作的原因:因为您已将它们配置为而不是,因此......未配置它们。

可能与(这一个咬我):没有要求basicConfig的时候,我似乎没有得到我调试信息,即使我把我的处理程序调试级别。经过一番拉毛后,我发现你必须将自定义记录器的等级设置为DEBUG。如果您的记录器设置为WARNING,那么将处理器设置为DEBUG(本身)不会在logger.info()和logger.debug()上获得任何输出。

7

卡洛斯A.伊巴拉这个答案是在原则上是正确,但是,这种实现可能打破,因为你迭代()可能会通过调用removeHandler更改的列表。这是不安全的。 两个替代方案是:

while len(logging.root.handlers) > 0: 
    logging.root.removeHandler(logging.root.handlers[-1]) 
logging.basicConfig(format='%(asctime)s %(message)s',level=logging.DEBUG) 

或:

logging.root.handlers = [] 
logging.basicConfig(format='%(asctime)s %(message)s',level=logging.DEBUG) 

其中这两个使用环是第一最安全的(因为该处理程序的任何破坏代码可以被日志框架内显式调用) 。尽管如此,这仍然是一个骇客,因为我们依靠logging.root.handlers作为列表。