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