parameters: (logger=None, base=None)
return_statement: return LoggingUndefined
docstring: Given a logger object this returns a new undefined class that will
      log certain failures.  It will log iterations and printing.  If no
      logger is given a default logger is created.
  
      Example::
  
          logger = logging.getLogger(__name__)
          LoggingUndefined = make_logging_undefined(
              logger=logger,
              base=Undefined
          )
  
      .. versionadded:: 2.8
  
      :param logger: the logger to use.  If not provided, a default logger
                     is created.
      :param base: the base class to add logging functionality to.  This
                   defaults to :class:`Undefined`.
docstring_summary: Given a logger object this returns a new undefined class that will
      log certain failures.  It will log iterations and printing.  If no
      logger is given a default logger is created.
docstring_tokens: Given a logger object this returns a new undefined class that will log certain failures . It will log iterations and printing . If no logger is given a default logger is created .
function: def make_logging_undefined(logger=None, base=None):
      """Given a logger object this returns a new undefined class that will
      log certain failures.  It will log iterations and printing.  If no
      logger is given a default logger is created.
  
      Example::
  
          logger = logging.getLogger(__name__)
          LoggingUndefined = make_logging_undefined(
              logger=logger,
              base=Undefined
          )
  
      .. versionadded:: 2.8
  
      :param logger: the logger to use.  If not provided, a default logger
                     is created.
      :param base: the base class to add logging functionality to.  This
                   defaults to :class:`Undefined`.
      """
      if logger is None:
          import logging
          logger = logging.getLogger(__name__)
          logger.addHandler(logging.StreamHandler(sys.stderr))
      if base is None:
          base = Undefined
  
      def _log_message(undef):
          if undef._undefined_hint is None:
              if undef._undefined_obj is missing:
                  hint = '%s is undefined' % undef._undefined_name
              elif not isinstance(undef._undefined_name, string_types):
                  hint = '%s has no element %s' % (
                      object_type_repr(undef._undefined_obj),
                      undef._undefined_name)
              else:
                  hint = '%s has no attribute %s' % (
                      object_type_repr(undef._undefined_obj),
                      undef._undefined_name)
          else:
              hint = undef._undefined_hint
          logger.warning('Template variable warning: %s', hint)
  
      class LoggingUndefined(base):
  
          def _fail_with_undefined_error(self, *args, **kwargs):
              try:
                  return base._fail_with_undefined_error(self, *args, **kwargs)
              except self._undefined_exception as e:
                  logger.error('Template variable error: %s', str(e))
                  raise e
  
          def __str__(self):
              rv = base.__str__(self)
              _log_message(self)
              return rv
  
          def __iter__(self):
              rv = base.__iter__(self)
              _log_message(self)
              return rv
  
          if PY2:
              def __nonzero__(self):
                  rv = base.__nonzero__(self)
                  _log_message(self)
                  return rv
  
              def __unicode__(self):
                  rv = base.__unicode__(self)
                  _log_message(self)
                  return rv
          else:
              def __bool__(self):
                  rv = base.__bool__(self)
                  _log_message(self)
                  return rv
  
      return LoggingUndefined
function_tokens: def make_logging_undefined ( logger = None , base = None ) : if logger is None : import logging logger = logging . getLogger ( __name__ ) logger . addHandler ( logging . StreamHandler ( sys . stderr ) ) if base is None : base = Undefined def _log_message ( undef ) : if undef . _undefined_hint is None : if undef . _undefined_obj is missing : hint = '%s is undefined' % undef . _undefined_name elif not isinstance ( undef . _undefined_name , string_types ) : hint = '%s has no element %s' % ( object_type_repr ( undef . _undefined_obj ) , undef . _undefined_name ) else : hint = '%s has no attribute %s' % ( object_type_repr ( undef . _undefined_obj ) , undef . _undefined_name ) else : hint = undef . _undefined_hint logger . warning ( 'Template variable warning: %s' , hint ) class LoggingUndefined ( base ) : def _fail_with_undefined_error ( self , * args , * * kwargs ) : try : return base . _fail_with_undefined_error ( self , * args , * * kwargs ) except self . _undefined_exception as e : logger . error ( 'Template variable error: %s' , str ( e ) ) raise e def __str__ ( self ) : rv = base . __str__ ( self ) _log_message ( self ) return rv def __iter__ ( self ) : rv = base . __iter__ ( self ) _log_message ( self ) return rv if PY2 : def __nonzero__ ( self ) : rv = base . __nonzero__ ( self ) _log_message ( self ) return rv def __unicode__ ( self ) : rv = base . __unicode__ ( self ) _log_message ( self ) return rv else : def __bool__ ( self ) : rv = base . __bool__ ( self ) _log_message ( self ) return rv return LoggingUndefined