Python日志记录不会关闭

ner*_*rks 3 python logging

我一直在学习python日志记录模块,但是在完成后将日志记录关闭了.这是一个例子 -

import logging

log = logging.getLogger()
log.setLevel(logging.INFO)
handler = logging.FileHandler('test.log')
handler.setLevel(logging.INFO)
formatter = logging.Formatter(
            fmt='%(asctime)s %(levelname)s: %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S'
            )
handler.setFormatter(formatter)
log.addHandler(handler)

log.info('log file is open')  
logging.shutdown()
log.info('log file should be closed')
Run Code Online (Sandbox Code Playgroud)

但该模块在logging.shutdown()之后仍在进行日志记录,因为日志文件看起来像这样 -

# cat test.log
2014-07-17 19:39:35 INFO: log file is open
2014-07-17 19:39:35 INFO: log file should be closed
Run Code Online (Sandbox Code Playgroud)

根据文档,该命令应该"通过刷新和关闭所有处理程序来执行有序关闭".我应该做其他事情来关闭日志文件吗?

ner*_*rks 9

所以我发现使用shutdown()并不会完全消除日志记录的文件处理程序.最好的方法似乎是手动删除文件处理程序 -

def main():
    log = logging.getLogger()
    log.setLevel(logging.INFO)
    fh = logging.FileHandler(filename='test.log')
    fh.setLevel(logging.INFO)
    formatter = logging.Formatter(
                    fmt='%(asctime)s %(levelname)s: %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S'
                    )
    fh.setFormatter(formatter)
    log.addHandler(fh)

    log.info('-------Start--------')
    log.info('this function is doing something')
    log.info('this function is finished')
    log.removeHandler(fh) <--------------------------Add this line
    del log,fh
Run Code Online (Sandbox Code Playgroud)


小智 6

我在每次调用函数时创建一个新的记录器时遇到了同样的问题。我发现的一个解决方案是在执行代码后清除所有处理程序

log.handlers.clear()
Run Code Online (Sandbox Code Playgroud)

不知道这是否是正确的方法,但它对我有用。


kha*_*son 5

Python的文件shutdown规定:

这应该在应用程序出口处调用,并且在此调用之后不应再使用日志记录系统.

这并不意味着之后不能使用记录器对象.在调用之后shutdown,只是不要尝试使用该记录器对象记录任何其他内容,这应该没问题.