Skip to content

Log Levels

Six levels from most verbose to most critical.

Level Hierarchy

LevelPriorityWhen to Use
trace10Detailed debugging (function entry/exit, variable values)
debug20Development debugging (request details, state changes)
info30Normal operations (server started, user logged in)
warn40Potential issues (deprecated API, high memory)
error50Errors (failed request, caught exception)
fatal60Critical failures (app crash, unrecoverable)

Level Filtering

Setting minLevel logs that level and all higher priority levels:

typescript
const log = createLogger('App', { minLevel: 'warn' });

log.trace('ignored');  // ❌ priority 10 < 40
log.debug('ignored');  // ❌ priority 20 < 40
log.info('ignored');   // ❌ priority 30 < 40
log.warn('logged');    // ✅ priority 40 >= 40
log.error('logged');   // ✅ priority 50 >= 40
log.fatal('logged');   // ✅ priority 60 >= 40

Quick Reference Table

minLeveltracedebuginfowarnerrorfatal
'trace'
'debug'
'info'
'warn'
'error'
'fatal'

Runtime Level Control

Change log level at runtime:

typescript
const log = createLogger('App');

// Start with all levels
log.trace('Detailed info');  // ✅ Logged

// Later, reduce noise
log.setLevel('error');
log.trace('Detailed info');  // ❌ Now ignored
log.error('Problem!');       // ✅ Still logged

Check Before Expensive Operations

Avoid computing expensive data if it won't be logged:

typescript
if (log.isLevelEnabled('debug')) {
  // Only compute if debug is enabled
  const debugData = JSON.stringify(largeObject, null, 2);
  log.debug('Full state', { data: debugData });
}

Environment Defaults

EnvironmentDefault minLevel
Developmenttrace (all logs)
Testtrace (all logs)
Productioninfo (no trace/debug)

Override:

typescript
// Force specific level regardless of environment
const log = createLogger('App', { minLevel: 'debug' });

Released under the MIT License.