我一直在学习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)
根据文档,该命令应该"通过刷新和关闭所有处理程序来执行有序关闭".我应该做其他事情来关闭日志文件吗?
所以我发现使用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)
不知道这是否是正确的方法,但它对我有用。