How to add custom parameter into Python logging formatter?

前端 未结 2 1597
梦如初夏
梦如初夏 2021-02-05 17:43

I\'m using standard Python logging module with Flask framework. I want to write logs to file with the all records of users actions with custom parameter - %(username)s to loggin

相关标签:
2条回答
  • 2021-02-05 18:06

    u can do it with logging.LoggerAdapter

    myLogger = logging.LoggerAdapter(logging.getLogger("my-logger"), {"username" : get_user_name()})
    

    Here is the complete solution for your program. I use a dict to build my configuration. It is better, if you have more logger

        def get_user_name():
            return session.get("username", "")
    
        LOGGING = {
            'version': 1,
            'disable_existing_loggers': True,
            'formatters': {
                'my_format': {
                    'format': '%(username)s - %(asctime)s %(levelname)-10s %(message)s  [in %(pathname)s:%(lineno)d]'
                },
            },
            'handlers': {
                'my_handler': {
                    'level': 'DEBUG',
                    'class': 'logging.handlersRotatingFileHandler',
                    'filename': fname,
                    'maxBytes': 1 * 1024 * 1024,
                    'backupCount': 5,
                },
            },
            'loggers': {
                'my_logger': {
                    'handlers': ['my_handler'],
                    'propagate': True,
                    'level': 'DEBUG',
                },
            } }
    
    logging.config.dictConfig(LOGGING) 
    logging.LoggerAdapter(logging.getLogger('my_logger'),
                                               {"username" : get_user_name()})
    
    0 讨论(0)
  • 2021-02-05 18:09

    Isn't the easier way to just subclass a Formatter and add your custom attribute to the LogRecord just before formatting?

    For instance I use this code:

    # A custom formatter to add the timestamp from the simulated clock.
    class _Formatter(logging.Formatter):
      def format(self, record):
        record.simulated_clock = clock.get_time()
        return super(_Formatter, self).format(record)
    
    # Creates a logger object.
    def _create_logger():
      logger = logging.getLogger("simulation")
      logger.setLevel(kLevel)
      ch = logging.StreamHandler()
      ch.setLevel(kLevel)
      formatter = _Formatter("%(simulated_clock)s - %(levelname)s - %(message)s")
      ch.setFormatter(formatter)
      logger.addHandler(ch)
    
      return logger
    

    I don't consider myself a Python expert, but it works for me....

    0 讨论(0)
提交回复
热议问题