Python 如何通过使用“删除所有处理程序”干净地开始多次日志记录;removeHandler(…)“;?

Python 如何通过使用“删除所有处理程序”干净地开始多次日志记录;removeHandler(…)“;?,python,python-3.x,logging,Python,Python 3.x,Logging,在开发过程中,我使用python日志模块。例如,在发生未处理的异常后,我想重新运行程序并重新初始化日志记录。 出于某种原因,我似乎无法从日志实例中删除所有处理程序。尽管如此,它从未被删除 import logging log = logging.getLogger(__name__) print('Existing handlers:') print(log.handlers) #Remove all handlers: for handler in log.handlers: #get r

在开发过程中,我使用python日志模块。例如,在发生未处理的异常后,我想重新运行程序并重新初始化日志记录。 出于某种原因,我似乎无法从日志实例中删除所有处理程序。尽管如此,它从未被删除

import logging

log = logging.getLogger(__name__)
print('Existing handlers:')
print(log.handlers)

#Remove all handlers:
for handler in log.handlers: #get rid of existing old handlers
    print('removing handler %s'%handler)
    log.removeHandler(handler)

#excpecting "[]" for log.handlers
print('Existing handlers after removal:')
print(log.handlers)

fh1 = logging.StreamHandler()
formatter1 = logging.Formatter('fh1: %(levelname)s - %(message)s')
fh1.setFormatter(formatter1)

fh2 = logging.StreamHandler()
formatter2 = logging.Formatter('fh2: %(levelname)s - %(message)s')
fh2.setFormatter(formatter2)

log.addHandler(fh1)
log.addHandler(fh2)

log.error('Some logging occurs here')
在全新IPython控制台中首次运行时,我得到:

fh1: ERROR - Some logging occurs here
fh2: ERROR - Some logging occurs here
Existing handlers:
[]
Existing handlers after removal:
[]
这几乎是我所期望的。外表的顺序让我有点烦。为什么日志显示在打印输出之前?第二次启动程序时,它确实变得很奇怪:

fh2: ERROR - Some logging occurs here
fh1: ERROR - Some logging occurs here
fh2: ERROR - Some logging occurs here
Existing handlers:
[<StreamHandler stderr (NOTSET)>, <StreamHandler stderr (NOTSET)>]
removing handler <StreamHandler stderr (NOTSET)>
Existing handlers after removal:
[<StreamHandler stderr (NOTSET)>]
fh2:错误-此处发生一些日志记录
fh1:错误-此处发生一些日志记录
fh2:错误-此处发生一些日志记录
现有处理程序:
[, ]
移除处理程序
删除后的现有处理程序:
[]
似乎删除句柄的for循环只执行一次。 因此,我得到了3个日志条目,这不是我想要的。我期待第二次跑步:

Existing handlers:
[<StreamHandler stderr (NOTSET)>, <StreamHandler stderr (NOTSET)>]
removing handler <StreamHandler stderr (NOTSET)>
removing handler <StreamHandler stderr (NOTSET)>
Existing handlers after removal:
[]
fh1: ERROR - Some logging occurs here
fh2: ERROR - Some logging occurs here
现有处理程序:
[, ]
移除处理程序
移除处理程序
删除后的现有处理程序:
[]
fh1:错误-此处发生一些日志记录
fh2:错误-此处发生一些日志记录
我似乎错过了一些概念。 +为什么for循环只运行一次,尽管
len(log.handlers)
在第一次运行后返回2,在第二次运行后返回3


  • 为什么打印命令和日志命令的顺序混淆了

  • 最重要的是: 如何正确删除所有处理程序?还是日志记录被迫干净地开始


我使用的是python 3.7.1和logging 0.5.1.2,我认为这个问题更多地与您的系统操作系统和计算机硬件特性有关。一切都很好,在我这边连续打印

大约3个日志记录条目-在
日志记录
模块中刷新文本可能存在相同的问题

注意:在删除日志处理程序的部分中,应在迭代之前复制此列表。这就是为什么您没有清除所有日志处理程序。像这样:

#Remove all handlers:
    for handler in log.handlers[:]: #get rid of existing old handlers
        print('removing handler %s'%handler)
        log.removeHandler(handler)

这样可以删除所有处理程序:

logger=logging.getLogger()
while logger.hasHandlers():
logger.removeHandler(logger.Handler[0])

“为什么打印命令和日志命令的顺序混淆?”请尝试使用
print('text',flush=True)
在某些情况下,打印输出可以缓冲,这会强制刷新是的,这回答了第一部分,谢谢。