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
- Use a valid level label (trace/debug/info/warn/error/fatal/silent) or a registered custom level
- For numeric levels, ensure the value is within the defined range and registered via customLevels if non-standard
- 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
- Prefer level labels over numbers in configuration
- When using numeric levels with customLevels, verify index ranges at startup
- Centralize level assignment behind a guarded setter
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
- unknown level ${level}
- Levels comparison should be one of "ASC", "DESC" or "functio
- pino – redact must contain an array of strings
- pino: transmit option must have a send function
- customLevels is required if useOnlyCustomLevels is set true
AI-assisted analysis of pinojs/pino@5aa62305c5 (2026-09-02).
Data as JSON: /api/errors/c60864c281298058.
Report an issue: GitHub.