def close(self): """Flush the buffer and tidies up any resources used by this handler.""" with self.__emit_lock: self.__close_called = True if self.__flush_event is not None: flush.cancel(self.__flush_event) self.__flush(close_called=True) logging.Handler.close(self)
def flush(self): """Ensure all logging output has been flushed.""" self.__flush(close_called=False) with self.__emit_lock: if self.__flush_event is not None and not self.__close_called: # We cancel 'self.__flush_event' in case flush() was called by someone other than # the flush thread to avoid having multiple flush() events scheduled. flush.cancel(self.__flush_event) self.__flush_event = flush.flush_after(self, delay=self.interval_secs) self.__flush_scheduled_by_emit = False
def emit(self, record): """Emit a record. Append the record to the buffer after it has been transformed by process_record(). If the length of the buffer is greater than or equal to its capacity, then the flush() event is rescheduled to immediately process the buffer. """ processed_record = self.process_record(record) with self.__emit_lock: self.__emit_buffer.append(processed_record) if self.__flush_event is None: # Now that we've added our first record to the buffer, we schedule a call to flush() # to occur 'self.interval_secs' seconds from now. 'self.__flush_event' should never # be None after this point. self.__flush_event = flush.flush_after( self, delay=self.interval_secs) if not self.__flush_scheduled_by_emit and len( self.__emit_buffer) >= self.capacity: # Attempt to flush the buffer early if we haven't already done so. We don't bother # calling flush.cancel() and flush.flush_after() when 'self.__flush_event' is # already scheduled to happen as soon as possible to avoid introducing unnecessary # delays in emit(). if flush.cancel(self.__flush_event): self.__flush_event = flush.flush_after(self, delay=0.0) self.__flush_scheduled_by_emit = True
def close(self, **kwargs): """Flush the buffer and tidies up any resources used by this handler.""" # Import here after the build id has been set. from buildscripts.resmokelib.config import EVERGREEN_BUILD_ID with self.__emit_lock: self.__close_called = True if self.__flush_event is not None: flush.cancel(self.__flush_event) # Don't flush successful tests in patch builds to save on logkeeper space. # Keep the last item so flush doesn't hang on an empty buffer. if EVERGREEN_BUILD_ID is not None and "_patch_" in EVERGREEN_BUILD_ID and not kwargs.get( "test_failed_flag", False): self.use_initial_interval = True self.__emit_buffer = [] self.__flush(close_called=True) logging.Handler.close(self)