Записывает ли журнал python каждый журнал?

Когда я записываю журнал в файл с помощью стандартного модуля 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, который не выполняет flush при каждом вызове emit (даже если вы рискуете потерять много журналов, если возникает плохое исключение/сбой интерпретатора).

licensed under cc by-sa 3.0 with attribution.