gpt4 book ai didi

python - 如何通过删除所有带有 "removeHandler(...)"的处理程序来干净地开始多次记录?

转载 作者:行者123 更新时间:2023-12-01 07:31:47 26 4
gpt4 key购买 nike

在开发过程中,我使用 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)>]

似乎删除句柄的 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

我似乎错过了一些概念。+ 为什么 for 循环只运行一次,尽管len(log.handlers)第一次运行后返回 2,第二次运行后返回 3?

  • 为什么打印和记录命令的顺序混淆了?

  • 最重要的是:如何正确删除所有处理程序?或者强制干净地启动日志记录?

我正在使用 python 3.7.1 并记录 0.5.1.2

最佳答案

我认为这个问题与您的系统操作系统以及您的计算机硬件特性更有关系。一切工作正常并且在我这边连续打印

大约 3 个日志记录条目 - 也许在 logging 模块中刷新文本也存在同样的问题

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

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

关于python - 如何通过删除所有带有 "removeHandler(...)"的处理程序来干净地开始多次记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57176860/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com