{"record":{"id":"c60864c281298058","repo":"pinojs/pino","slug":"unknown-level-value-level","errorCode":null,"errorMessage":"unknown level value${level}","messagePattern":"unknown level value(.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"lib/levels.js","lineNumber":80,"sourceCode":"  }\n\n  switch (level) {\n    case 'fatal':\n    case 'error':\n    case 'warn':\n    case 'info':\n    case 'debug':\n    case 'trace':\n      return true\n    default:\n      return false\n  }\n}\n\nfunction setLevel (level) {\n  const { labels, values } = this.levels\n  if (typeof level === 'number') {\n    if (labels[level] === undefined) throw Error('unknown level value' + level)\n    level = labels[level]\n  }\n  if (values[level] === undefined) throw Error('unknown level ' + level)\n  const preLevelVal = this[levelValSym]\n  const levelVal = this[levelValSym] = values[level]\n  const useOnlyCustomLevelsVal = this[useOnlyCustomLevelsSym]\n  const levelComparison = this[levelCompSym]\n  const hook = this[hooksSym].logMethod\n\n  for (const key in values) {\n    if (levelComparison(values[key], levelVal) === false) {\n      this[key] = noop\n      continue\n    }\n    this[key] = isStandardLevel(key, useOnlyCustomLevelsVal) ? levelMethods[key](hook) : genLog(values[key], hook)\n  }\n\n  this.emit(","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/pinojs/pino/blob/5aa62305c57709ebd6f6b7c328e8830eeb29b297/lib/levels.js#L62-L98","documentation":"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'.","triggerScenarios":"logger.level = 99 (numeric index beyond defined levels) or logger.level = 'verbose' where the label isn't registered via customLevels.","commonSituations":"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.","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"],"exampleFix":"// before\nlogger.level = Number(process.env.LOG_LEVEL); // e.g. 99\n// after\nconst lvl = process.env.LOG_LEVEL;\nif (lvl in logger.levels.values) logger.level = lvl; else logger.level = 'info';","handlingStrategy":"validation","validationCode":"function safeSetLevel(logger, level) {\n  const { labels, values } = logger.levels;\n  const ok = typeof level === 'number' ? labels[level] !== undefined : values[level] !== undefined;\n  if (!ok) throw new Error(`invalid level: ${level}`);\n  logger.level = level;\n}","typeGuard":"function isValidLevel(logger, level) {\n  const { labels, values } = logger.levels;\n  return typeof level === 'number' ? labels[level] !== undefined : values[level] !== undefined;\n}","tryCatchPattern":"try { logger.level = level; } catch (e) { if (/unknown level/.test(e.message)) { logger.level = 'info'; } else { throw e; } }","preventionTips":["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"],"tags":["logging","pino","levels","validation"],"backgroundTag":"invalid-log-level","analyzedSha":"5aa62305c57709ebd6f6b7c328e8830eeb29b297","analyzedAt":"2026-09-02T22:05:21.418Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}