human
Complete this python program:
def make_logging_undefined(logger=None, base=None):
assistant
#Here is the Python program you requested.

    """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