Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does python logging flush every log?

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 ?

like image 774
Vincent Xue Avatar asked May 19 '13 10:05

Vincent Xue


1 Answers

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).

like image 93
Bakuriu Avatar answered Sep 23 '22 09:09

Bakuriu