How do I add custom field to Python log format string?

My current format string is:

    formatter = logging.Formatter('%(asctime)s : %(message)s')

and I want to add a new field called app_name and which will have a different value in each script that contains this formatter.

    import logging
    formatter = logging.Formatter('%(asctime)s %(app_name)s : %(message)s')
    syslog.setFormatter(formatter)
    logger.addHandler(syslog)

But I'm not sure how to pass that app_name value to the logger to interpolate into the format string. I can obviously get it to appear in the log message but passing it each time but this is messy.

I've tried:

    logging.info('Log message', app_name='myapp')
    logging.info('Log message', {'app_name', 'myapp'})
    logging.info('Log message', 'myapp')

but none work.

You could use a LoggerAdapter so you don't have to pass the extra info with every logging call:

    import logging
    extra = {'app_name':'Super App'}

    logger = logging.getLogger(__name__)
    syslog = logging.StreamHandler()
    formatter = logging.Formatter('%(asctime)s %(app_name)s : %(message)s')
    syslog.setFormatter(formatter)
    logger.setLevel(logging.INFO)
    logger.addHandler(syslog)

    logger = logging.LoggerAdapter(logger, extra)
    logger.info('The sky is so blue')

logs (something like)

    2013-07-09 17:39:33,596 Super App : The sky is so blue

Filters can also be used to add contextual information.

    import logging

    class AppFilter(logging.Filter):
        def filter(self, record):
            record.app_name = 'Super App'
            return True

    logger = logging.getLogger(__name__)
    logger.addFilter(AppFilter())
    syslog = logging.StreamHandler()
    formatter = logging.Formatter('%(asctime)s %(app_name)s : %(message)s')
    syslog.setFormatter(formatter)
    logger.setLevel(logging.INFO)
    logger.addHandler(syslog)

    logger.info('The sky is so blue')

produces a similar log record.

From: stackoverflow.com/q/17558552