【问题标题】:Changing logging's 'basicConfig' which is already set更改已设置的日志记录“basicConfig”
【发布时间】:2012-08-22 21:20:53
【问题描述】:

我在python中使用日志模块为:

import logging, sys
logger= logging.getLogger(__file__)
logging.basicConfig(stream = sys.stderr, level=logging.DEBUG, format='%(filename)s:%(lineno)s %(levelname)s:%(message)s')
logger.debug("Hello World")

现在,在我在line 3 上设置了基本配置之后,我想要一个命令行参数,可以将输出流从 sys.stderr 更改为文件。

我已阅读文档,它说如果 filenamestream 同时存在,stream 将被忽略。

现在,我想知道在我已经完成了line 3 中的basicConfig 事情之后如何将流更改为文件?

【问题讨论】:

    标签: python logging


    【解决方案1】:

    如果您查看logging/__init__.py 的Python 源代码,您会看到basicConfig() 通过调用addHandler() 在根记录器对象上设置处理程序。如果您想从头开始,您可以删除所有现有的处理程序,然后再次调用basicConfig()

    # Example to remove all root logger handlers and reconfigure. (UNTESTED)
    import logging
    
    # Remove all handlers associated with the root logger object.
    for handler in logging.root.handlers[:]:
        logging.root.removeHandler(handler)
    
    # Reconfigure logging again, this time with a file.
    logging.basicConfig(filename = 'myfile.log', level=logging.DEBUG, format='%(filename)s:%(lineno)s %(levelname)s:%(message)s')
    

    【讨论】:

    • 另外,在这里使用列表理解删除所有处理程序,就像下面的代码会更简单:) [logging.root.removeHandler(handler) for handler in logging.root.handlers[:]]
    • @KevinGuan 列表推导用于构建列表。如果要在循环中运行语句,请使用循环。
    • 这很有帮助。我在一个用 basicConfig 设置记录器的函数中使用了这个解决方案。现在,当我在循环内部调用它时,我可以在每次迭代中记录到不同的单个日志文件。
    • 从 Python 3.8 开始,basicConfig 现在接受 force 参数来删除现有的根处理程序。
    • @Spack,您是说我们可以删除上面的第 5+6 行并将第 9 行设置为 logging.basicConfig(filename='myfile.log', ..., force = True) 之类的东西吗?
    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多