docs: def log(self, logger=None, label=None, eager=False):
          '''
          Log query result consumption details to a logger.
  
          Args:
              logger: Any object which supports a debug() method which accepts a
                  str, such as a Python standard library logger object from the
                  logging module.  If logger is not provided or is None, this
                  method has no logging side effects.
  
              label: An optional label which will be inserted into each line of
                  logging output produced by this particular use of log
  
              eager: An optional boolean which controls how the query result will
                  be consumed.  If True, the sequence will be consumed and logged
                  in its entirety. If False (the default) the sequence will be
                  evaluated and logged lazily as it consumed.
  
          Warning: Use of eager=True requires use of sufficient memory to
              hold the entire sequence which is obviously not possible with
              infinite sequences.  Use with care!
  
          Returns:
              A queryable over the unaltered source sequence.
  
          Raises:
              AttributeError: If logger does not support a debug() method.
              ValueError: If the Queryable has been closed.
          '''
          if self.closed():
              raise ValueError("Attempt to call log() on a closed Queryable.")
  
          if logger is None:
              return self
  
          if label is None:
              label = repr(self)
  
          if eager:
              return self._create(self._eager_log_result(logger, label))
  
          return self._create(self._generate_lazy_log_result(logger, label))