Advanced Python logging system
PEP-8 Conventions


Top-level functions should be separated (preceded and followed) by two blank lines:

logger.setLevel(logging.INFO)


def l(*args, **kwargs):
     &lt;body&gt;

Don't mix single quotes ' and double quotes " in a single file (or project). You may you use either of them, but 


  Pick a rule and stick to it.

Lines should not exceed 79 characters (or 73 characters for documentation).


General concerns


l is a bad name for a function. Always try to pick a name that describes what the function does, like log.
You haven't added any docstrings to your function. If anyone else wants to use your code, they have no way to know what parameters to pass (or what the function actually does). According to PEP-257,


  All modules should normally have docstrings, and all functions and classes exported by a module should also have docstrings.


A good docstring describes what your function does, what parameters it expects, what it returns and if applicable, what Exception it raises if something goes wrong.
assert should really only be used for debugging purposes, not in the 'stable' release. I propose raising a ValueError instead.
Since you're only retrieving the level argument from **kwargs, you may as well make it a keyword argument.


Improved code

Taking into account all of the above, here's my rewritten version of your code:

import logging
from inspect import getframeinfo, stack

logger = logging.getLogger()
formatter = logging.Formatter('
    %(asctime)s %(name)-7s %(levelname)-8s %(message)s
')
file_handler = logging.FileHandler('mm.log')
file_handler.setFormatter(formatter)
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
logger.setLevel(logging.INFO)


def log(*args, level='info'):
    """Log a message to stdout and a log file.
    Arguments:
    - *args: All messages to be logged (as strings).

    - level: The level for debugging. Any of 'debug', 'info', 'warning',
             'error', 'critical'. Defaults to 'info'.

    Raises:
    - ValueError if an invalid `level` argument is passed.
    """
    LEVELS = ('debug', 'info', 'warning', 'error', 'critical')
    level = level.lower()
    if level not in LEVELS:
        raise ValueError('`level` argument must be any of {}'.format(
            str(LEVELS)[1:-1]
        )
    caller = getframeinfo(stack()[1][0])
    file_line = '%s:%d - ' % (caller.filename, caller.lineno)
    logger_input = file_line + ' '.join([str(a) for a in args])
    getattr(logger, level)(logger_input)


The use of *args in the above snippet breaks backward compatibility!