【问题标题】:Does python logging flush every log?python日志记录是否刷新每个日志?
【发布时间】:2013-05-14 02:09:14
【问题描述】:

当我使用标准模块 logging 将日志写入文件时,每个日志会单独刷新到磁盘吗? 比如下面的代码会刷新日志10次吗?

logging.basicConfig(level=logging.DEBUG, filename='debug.log')
    for i in xrange(10):
        logging.debug("test")

如果是这样,它会变慢吗?

【问题讨论】:

    标签: python performance logging flush


    【解决方案1】:

    是的,它确实会在每次调用时刷新输出。你可以在StreamHandler的源代码中看到这一点:

    def flush(self):
        """
        Flushes the stream.
        """
        self.acquire()
        try:
            if self.stream and hasattr(self.stream, "flush"):
                self.stream.flush()
        finally:
            self.release()
    
    def emit(self, record):
        """
        Emit a record.
    
        If a formatter is specified, it is used to format the record.
        The record is then written to the stream with a trailing newline.  If
        exception information is present, it is formatted using
        traceback.print_exception and appended to the stream.  If the stream
        has an 'encoding' attribute, it is used to determine how to do the
        output to the stream.
        """
        try:
            msg = self.format(record)
            stream = self.stream
            stream.write(msg)
            stream.write(self.terminator)
            self.flush()   # <---
        except (KeyboardInterrupt, SystemExit): #pragma: no cover
            raise
        except:
            self.handleError(record)
    

    我不会真正介意日志记录的性能,至少在分析并发现它是一个瓶颈之前不会。无论如何,您始终可以创建一个 Handler 子类,它不会在每次调用 emit 时执行 flush(即使如果发生错误异常/解释器崩溃,您将面临丢失大量日志的风险)。

    【讨论】:

    • flush() 方法不是来自 ancestor class 的空体吗? flush() 的 StreamHandler() 方法是否覆盖它?
    • @akhan Yes.
    猜你喜欢
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    相关资源
    最近更新 更多