docs: def _get_file_handler(location, rotate, rotate_count):
      """
      Args:
          location (str | unicode | None): Log file path
          rotate (str | unicode | None): How to rotate, examples:
              time:midnight - Rotate at midnight
              time:15s - Rotate every 15 seconds
              time:2h - Rotate every 2 hours
              time:7d - Rotate every 7 days
              size:20m - Rotate every 20MB
              size:1g - Rotate every 1MB
          rotate_count (int): How many backups to keep
  
      Returns:
          (logging.Handler): Associated handler
      """
      if not rotate:
          return logging.FileHandler(location)
  
      kind, _, mode = rotate.partition(":")
  
      if not mode:
          raise ValueError("Invalid 'rotate' (missing kind): %s" % rotate)
  
      if kind == "time":
          if mode == "midnight":
              return TimedRotatingFileHandler(location, when="midnight", backupCount=rotate_count)
  
          timed = "shd"
          if mode[-1].lower() not in timed:
              raise ValueError("Invalid 'rotate' (unknown time spec): %s" % rotate)
  
          interval = to_int(mode[:-1])
          if interval is None:
              raise ValueError("Invalid 'rotate' (time range not an int): %s" % rotate)
  
          return TimedRotatingFileHandler(location, when=mode[-1], interval=interval, backupCount=rotate_count)
  
      if kind == "size":
          size = to_bytesize(mode)
          if size is None:
              raise ValueError("Invalid 'rotate' (size not a bytesize): %s" % rotate)
  
          return RotatingFileHandler(location, maxBytes=size, backupCount=rotate_count)
  
      raise ValueError("Invalid 'rotate' (unknown type): %s" % rotate)