When I write a log to file using the standard module logging, will each log be flushed to disk separately? For example, will the following code flush log by 10 times?
logging.basicConfig(level=logging.DEBUG, filename='debug.log') for i in xrange(10): logging.debug("test")
if so, will it slow down ?
Yes, it does flush the output at every call. You can see this in the source code for the 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)
I wouldn't really mind about the performance of logging, at least not before profiling and discovering that it is a bottleneck. Anyway you can always create a Handler
subclass that doesn't perform flush
at every call to emit
(even though you will risk to lose a lot of logs if a bad exception occurs/the interpreter crashes).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With