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

2024-09-30 10:26:52 发布

您现在位置:Python中文网/ 问答频道 /正文

在开发过程中,我使用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?你知道吗

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

  • 最重要的是: 如何正确删除所有处理程序?还是说伐木必须干净地开始?

我使用的是python3.7.1和logging0.5.1.2


Tags: logherelogginghandlersstderrerrorsomehandler
1条回答
网友
1楼 · 发布于 2024-09-30 10:26:52

我认为这个问题更多地与你的系统操作系统和你的计算机硬件特性有关。一切都很好,在我这边不断印

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

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

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

相关问题 更多 >

    热门问题