torm
torm

Reputation: 1546

python logging - default value to extra parameters

I would like to set default value to extra parameter user_id. I've written filter:

class SystemLogFilter(logging.Filter):
    def filter(self, record):
        if not record.user_id:
            record.user_id = '--'

        return True

But I've got this error: AttributeError: 'LogRecord' object has no attribute 'user_id'

How can I get access to user_id parameter?

This is my logging configuration:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'system_log': {
            'format': '%(asctime)-15s - %(levelname)s - %(message)s - %(user_id)s'
        },
    },
    'filters': {
        'system2': {
            '()': 'system.logging2.SystemLogFilter',
        }
    },
    'handlers': {
        'file': {
            'level': 'INFO',
            'class': 'logging.FileHandler',
            'filename': (os.path.join(BASE_DIR, 'logs/system.log')),
            'formatter': 'system_log',
            'filters': ['system2'],
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'propagate': True,
            'level': 'INFO',
         },
    }
}

Upvotes: 9

Views: 8901

Answers (1)

Simeon Visser
Simeon Visser

Reputation: 122376

You can use hasattr (a built-in function) to check whether the log record has the desired attribute. If not, then you can set a default value.

For example:

class SystemLogFilter(logging.Filter):
    def filter(self, record):
        if not hasattr(record, 'user_id'):
            record.user_id = '--'
        return True

and then you need to attach this new filter to some logger (for example root logger) somewhere in your application (preferably the start):

root_logger = logging.getLogger()
root_logger.addFilter(SystemLogFilter())

Upvotes: 18

Related Questions