python日志记录是不是刷新每个日志?

Posted

技术标签:

【中文标题】python日志记录是不是刷新每个日志?【英文标题】: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")

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

【问题讨论】:

【参考方案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.

以上是关于python日志记录是不是刷新每个日志?的主要内容,如果未能解决你的问题,请参考以下文章

Loguru:Python 日志终极解决方案

Python 自定义日志记录处理程序,用于为字典中的每个键创建每个日志文件

将每个进程记录到不同的日志文件

python中更优雅的记录日志

python - 日志记录模块 - handlers.SysLogHandler - 发送多行而不是一行

数据库日志文件和内存刷新机制