{"record":{"id":"608b61a7eeb4a52e","repo":"pinojs/pino","slug":"default-level-defaultlevel-must-be-included-in","errorCode":null,"errorMessage":"default level:${defaultLevel} must be included in custom levels","messagePattern":"default level:(.+?) must be included in custom levels","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"lib/levels.js","lineNumber":183,"sourceCode":"    customNums\n  )\n  const values = Object.assign(\n    Object.create(Object.prototype, { silent: { value: Infinity } }),\n    useOnlyCustomLevels ? null : DEFAULT_LEVELS,\n    customLevels\n  )\n  return { labels, values }\n}\n\nfunction assertDefaultLevelFound (defaultLevel, customLevels, useOnlyCustomLevels) {\n  if (typeof defaultLevel === 'number') {\n    const values = [].concat(\n      Object.keys(customLevels || {}).map(key => customLevels[key]),\n      useOnlyCustomLevels ? [] : Object.keys(nums).map(level => +level),\n      Infinity\n    )\n    if (!values.includes(defaultLevel)) {\n      throw Error(`default level:${defaultLevel} must be included in custom levels`)\n    }\n    return\n  }\n\n  const labels = Object.assign(\n    Object.create(Object.prototype, { silent: { value: Infinity } }),\n    useOnlyCustomLevels ? null : DEFAULT_LEVELS,\n    customLevels\n  )\n  if (!(defaultLevel in labels)) {\n    throw Error(`default level:${defaultLevel} must be included in custom levels`)\n  }\n}\n\nfunction assertNoLevelCollisions (levels, customLevels) {\n  const { labels, values } = levels\n  for (const k in customLevels) {\n    if (k in values) {","sourceCodeStart":165,"sourceCodeEnd":201,"githubUrl":"https://github.com/pinojs/pino/blob/5aa62305c57709ebd6f6b7c328e8830eeb29b297/lib/levels.js#L165-L201","documentation":"assertDefaultLevelFound validates that the configured defaultLevel appears among the allowed level values: the customLevels values, plus (unless useOnlyCustomLevels is set) the default numeric levels, plus Infinity (silent). When defaultLevel is not found in that numeric set, pino throws because the logger would start at a level it cannot compare against.","triggerScenarios":"pino({ customLevels: { foo: 35 }, useOnlyCustomLevels: true }) — default level 'info' (30) is excluded because only custom levels are allowed; pino({ defaultLevel: 'warn', customLevels: { foo: 35 }, useOnlyCustomLevels: true }) without 'warn' in customLevels.","commonSituations":"Setting useOnlyCustomLevels: true but forgetting the defaultLevel must itself be a custom level; copying a config snippet with custom levels into a codebase that relies on the default 'info' level.","solutions":["Add the default level to customLevels (e.g. customLevels: { info: 30, foo: 35 }) when useOnlyCustomLevels is true.","Remove useOnlyCustomLevels: true so default pino levels remain available.","Set defaultLevel explicitly to one of the custom level names.","Verify the defaultLevel value/number matches one of the registered level values."],"exampleFix":"// before\nconst logger = pino({ customLevels: { trace2: 15 }, useOnlyCustomLevels: true })\n// after\nconst logger = pino({\n  customLevels: { trace2: 15, info: 30 },\n  defaultLevel: 'info',\n  useOnlyCustomLevels: true\n})","handlingStrategy":"validation","validationCode":"function assertCustomLevelsConfig(opts) {\n  const { customLevels = {}, useOnlyCustomLevels, level = 'info', defaultLevel = level } = opts\n  const numeric = Object.values(customLevels)\n  const ok = useOnlyCustomLevels\n    ? numeric.includes(defaultLevel)\n    : true\n  if (!ok) throw new Error(`defaultLevel ${defaultLevel} missing from customLevels`)\n}","typeGuard":"function hasValidDefaultLevel(opts) {\n  const customLevels = opts.customLevels || {}\n  const defaultLevel = opts.defaultLevel || opts.level || 'info'\n  return !opts.useOnlyCustomLevels || Object.values(customLevels).includes(defaultLevel)\n}","tryCatchPattern":"try {\n  logger = pino(opts)\n} catch (e) {\n  if (e.message.includes('must be included in custom levels')) {\n    throw new Error(`config error: defaultLevel '${opts.defaultLevel}' not in customLevels`, { cause: e })\n  }\n  throw e\n}","preventionTips":["When useOnlyCustomLevels is true, always include the default level in customLevels.","Set defaultLevel explicitly alongside useOnlyCustomLevels.","Unit-test logger construction with the production config object.","Avoid mixing default pino levels with useOnlyCustomLevels."],"tags":["configuration","logging","custom-levels"],"backgroundTag":"unknown-log-level","analyzedSha":"5aa62305c57709ebd6f6b7c328e8830eeb29b297","analyzedAt":"2026-09-02T22:05:21.418Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}