code: def _configure_common(
              self,
              prefix,
              fallback_level,
              fallback_format,
              handler_name,
              handler,
              custom_args=''
      ):
          
          ## Retrieve settings from config ##
          log_level = self.config.get_option(
              'LOGGING', prefix + 'log_level',
              None, fallback_level
          )
          log_format_name = self.config.get_option(
              'LOGGING', prefix + 'log_format',
              None, None
          )
          log_format = ReportingFormats[log_format_name].value if log_format_name else fallback_format
          log_format = log_format.format(custom_args=custom_args)  # should work even if no {custom_args}
  
          ## Attach handlers/formatter ##
          formatter = logging.Formatter(log_format)
          handler.setFormatter(formatter)
          handler.setLevel(log_level)
          self.logger.addHandler(handler)
          if not self.logger.isEnabledFor(logging.getLevelName(log_level)): # make sure logger level is not lower than handler level
              self.logger.setLevel(log_level)
  
          ## Save info about handler created ##
          self.log_info.append(handler_name + ' @ ' + str(log_level))
          self.log_handlers.append(handler)
docs: commom configuration code
  
          Args:
              prefix (str): A prefix for the `log_level` and `log_format` keys to use with the config. #FIXME: Hacky, add separate sections for each logger config?
              fallback_level (str): Fallback/minimum log level, for if config does not have one.
              fallback_format (str): Fallback format for if it's not in the config.
              handler_name (str): Handler used in debug messages.
              handler (str): The handler to configure and use.
              custom_args (str): special ID to include in messages