cube-js/cube · error

Invalid log level: ${filterByLevel}

Error message

Invalid log level: ${filterByLevel}

What it means

createLogger validates the filterByLevel argument against the known log levels (trace/debug/info/warn/error, with some allowed no-op cases). Passing any other string is rejected with 'Invalid log level: ...'.

Source

Thrown at packages/cubejs-server-core/src/core/logger.ts:179

        logMessage();
        break;
      }
    }
  }
};

export const createLogger = (production: boolean, filterByLevel: LogLevel = 'info'): LoggerFn => {
  switch (filterByLevel.toLowerCase()) {
    case 'trace':
    case 'info':
    case 'warn':
    case 'error':
      break;
    // not used, but let's allow
    case 'debug':
      break;
    default:
      throw new Error(`Invalid log level: ${filterByLevel}`);
  }

  if (production) {
    return prodLogger(filterByLevel);
  } else {
    return devLogger(filterByLevel);
  }
};

View on GitHub (pinned to 7d981676b3)

Solutions

  1. Use a supported level string: 'trace', 'debug', 'info', 'warn', or 'error'
  2. Check the env var or config that feeds filterByLevel (e.g. CUBEJS_LOG_LEVEL) for typos or unsupported names
  3. Normalize/whitelist the level before calling createLogger

Example fix

// before
const logger = createLogger('warning');
// after
const logger = createLogger('warn');
Defensive patterns

Strategy: validation

Validate before calling

const LEVELS = ['trace','debug','info','warn','error'];
function safeLevel(level) {
  return LEVELS.includes(level) ? level : 'info';
}

Type guard

const isValidLogLevel = (l: unknown): l is 'trace'|'debug'|'info'|'warn'|'error' =>
  typeof l === 'string' && ['trace','debug','info','warn','error'].includes(l);

Try / catch

let logger;
try {
  logger = createLogger(level);
} catch (e) {
  if (e.message.startsWith('Invalid log level:')) {
    logger = createLogger('info');
  } else { throw e; }
}

Prevention

When it happens

Trigger: Calling createLogger (or configuring the logger level) with a filterByLevel value not covered by the switch statement, e.g. 'verbose', 'LOG', 'fatal', or an undefined/empty value that reaches the default branch.

Common situations: Passing CUBEJS_LOG_LEVEL / logger config values that aren't one of the supported level strings; typo like 'warning' instead of 'warn'; programmatic logger creation in serverless deployments with a wrong default.

Related errors


AI-assisted analysis of cube-js/cube@7d981676b3 (2026-09-02). Data as JSON: /api/errors/80293bbd621054c6. Report an issue: GitHub.