看来,如果你调用logging.info()前运行logging.basicConfig,该logging.basicConfig调用不会有任何效果。事实上,没有记录发生。运行logging.basicConfig之前的Python日志记录?
此行为记录在哪里?我不太明白。
看来,如果你调用logging.info()前运行logging.basicConfig,该logging.basicConfig调用不会有任何效果。事实上,没有记录发生。运行logging.basicConfig之前的Python日志记录?
此行为记录在哪里?我不太明白。
您可以删除默认的处理程序,并重新登录这样的:
# 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)
是的。
你已经要求记录一些东西。因此,日志记录必须制作默认配置。一旦日志记录配置好了......好吧......已经配置好了。
“随着配置的记录器对象, 下面的方法创建日志 消息:”
此外,你可以阅读有关创建处理程序来防止虚假记录。但是,这比实用的技术更糟糕。
这是一个窍门。
无模块可以做,除了在全球范围内logging.getlogger()
要求任何东西。
只有if __name__ == "__main__":
可以做日志记录配置。
如果您在模块中以全局级别进行日志记录,那么您可能会强制日志记录来编译它的默认配置。
不要任何模块在做全球logging.info
。如果您绝对认为您必须在模块中具有全球级别的logging.info
,则必须在之前配置日志进行导入。这导致看起来不愉快的脚本。
不,我错了 - 显然,这是由设计basicConfig从.INFO等人打电话来确保安装了记录仪。它对我来说似乎仍然很古怪。 – 2012-07-06 06:59:41
下面是上面的回答并没有提及拼图...的一块,然后将所有的意义:在“根”记录 - 这,如果你打电话,说,logging.info()logging.basicConfig(水平= logging.DEBUG)之前被使用 - 有警告的默认日志记录级别。
这就是为什么logging.info()和logging.debug()不执行任何操作的原因:因为您已将它们配置为而不是,因此......未配置它们。
可能与(这一个咬我):没有要求basicConfig的时候,我似乎没有得到我调试信息,即使我把我的处理程序调试级别。经过一番拉毛后,我发现你必须将自定义记录器的等级设置为DEBUG。如果您的记录器设置为WARNING,那么将处理器设置为DEBUG(本身)不会在logger.info()和logger.debug()上获得任何输出。
卡洛斯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作为列表。
要逐字使用。如果你我 - 样试图重新使用以前的记录器实例化这样的:'记录= logging.getLogger(__ __名)',并尝试回路'logger.handlers'这是行不通的。 – 2013-07-03 17:11:10
什么是“如果root.handlers:”好?迭代空序列不起作用。 root.handlers可能是一些其他的非序列错误值吗? (这不是我的系统上) – Sebastian 2014-01-20 21:12:33
派上用场来到与AWS Lambda表达式调试日志记录问题。看起来他们在lambda引导过程中安装了一些名为'LambdaLoggingHandler'的处理程序。删除已安装的处理程序解决了问题。 – 2017-05-18 18:16:23