pinojs/pino · error · Error

unknown level value${level}

Error message

unknown level value${level}

What it means

The server-side setLevel (lib/levels.js:80) validates levels in both numeric and label form. A number with no matching label in this.levels.labels throws 'unknown level value' before label lookup; a string not present in this.levels.values throws 'unknown level'.

Source

Thrown at lib/levels.js:80

  }

  switch (level) {
    case 'fatal':
    case 'error':
    case 'warn':
    case 'info':
    case 'debug':
    case 'trace':
      return true
    default:
      return false
  }
}

function setLevel (level) {
  const { labels, values } = this.levels
  if (typeof level === 'number') {
    if (labels[level] === undefined) throw Error('unknown level value' + level)
    level = labels[level]
  }
  if (values[level] === undefined) throw Error('unknown level ' + level)
  const preLevelVal = this[levelValSym]
  const levelVal = this[levelValSym] = values[level]
  const useOnlyCustomLevelsVal = this[useOnlyCustomLevelsSym]
  const levelComparison = this[levelCompSym]
  const hook = this[hooksSym].logMethod

  for (const key in values) {
    if (levelComparison(values[key], levelVal) === false) {
      this[key] = noop
      continue
    }
    this[key] = isStandardLevel(key, useOnlyCustomLevelsVal) ? levelMethods[key](hook) : genLog(values[key], hook)
  }

  this.emit(

View on GitHub (pinned to 5aa62305c5)

Solutions

  1. Use a valid level label (trace/debug/info/warn/error/fatal/silent) or a registered custom level
  2. For numeric levels, ensure the value is within the defined range and registered via customLevels if non-standard
  3. Validate config values against Object.keys(logger.levels.values) before assignment

Example fix

// before
logger.level = Number(process.env.LOG_LEVEL); // e.g. 99
// after
const lvl = process.env.LOG_LEVEL;
if (lvl in logger.levels.values) logger.level = lvl; else logger.level = 'info';
Defensive patterns

Strategy: validation

Validate before calling

function safeSetLevel(logger, level) {
  const { labels, values } = logger.levels;
  const ok = typeof level === 'number' ? labels[level] !== undefined : values[level] !== undefined;
  if (!ok) throw new Error(`invalid level: ${level}`);
  logger.level = level;
}

Type guard

function isValidLevel(logger, level) {
  const { labels, values } = logger.levels;
  return typeof level === 'number' ? labels[level] !== undefined : values[level] !== undefined;
}

Try / catch

try { logger.level = level; } catch (e) { if (/unknown level/.test(e.message)) { logger.level = 'info'; } else { throw e; } }

Prevention

When it happens

Trigger: logger.level = 99 (numeric index beyond defined levels) or logger.level = 'verbose' where the label isn't registered via customLevels.

Common situations: Storing the level as a number in config/env and out-of-range values slipping in; using another library's level names; setting numeric levels on a logger with custom levels where the numeric mapping differs from defaults.

Related errors


AI-assisted analysis of pinojs/pino@5aa62305c5 (2026-09-02). Data as JSON: /api/errors/c60864c281298058. Report an issue: GitHub.