chubbyts-log-types
Description
Log (logger) types, PSR-3 inspired.
The package ships only types and a tiny createLogger helper, so libraries can depend on a logger contract
without depending on a concrete logging implementation.
Requirements
- node: >=22
Installation
Through NPM as @chubbyts/chubbyts-log-types.
npm i @chubbyts/chubbyts-log-types@^3.4.1
Usage
Types
import type {
Context,
LogFn,
Logger,
LogLevel,
NamedLogFn,
} from '@chubbyts/chubbyts-log-types/log';
type LogLevel =
| 'emergency'
| 'alert'
| 'critical'
| 'error'
| 'warning'
| 'notice'
| 'info'
| 'debug';
type Context = Record<string, unknown>;
type LogFn = (level: LogLevel, message: string, context: Context) => void;
type NamedLogFn = (message: string, context: Context) => void;
// one NamedLogFn per LogLevel, plus the generic log function
type Logger = Record<LogLevel, NamedLogFn> & { log: LogFn };
Create a logger
createLogger takes a single LogFn and derives all level-specific methods from it.
import { createLogger } from '@chubbyts/chubbyts-log-types/log';
const logger = createLogger((level, message, context) => {
const datetime = new Date().toISOString();
console.log(JSON.stringify({ datetime, level, message, context }));
});
logger.info('User logged in', { userId: 'a1b2c3' });
logger.error('Payment failed', { orderId: 42, reason: 'card declined' });
logger.log('warning', 'Disk space low', { freeBytes: 1_024 });
Null logger
Without an argument createLogger returns a logger that discards every message,
which is handy as a default or within tests.
import { createLogger } from '@chubbyts/chubbyts-log-types/log';
const logger = createLogger();
logger.debug('This goes nowhere', {});
Depend on the type
Accept a Logger instead of a concrete implementation.
import type { Logger } from '@chubbyts/chubbyts-log-types/log';
import { createLogger } from '@chubbyts/chubbyts-log-types/log';
export const createUserService = (logger: Logger = createLogger()) => ({
delete: (id: string) => {
logger.notice('User deleted', { id });
},
});
Filter by level
import type { LogFn, LogLevel } from '@chubbyts/chubbyts-log-types/log';
import { createLogger } from '@chubbyts/chubbyts-log-types/log';
// ordered from most to least severe
const levels: Array<LogLevel> = [
'emergency',
'alert',
'critical',
'error',
'warning',
'notice',
'info',
'debug',
];
const createMinLevelLogFn =
(minLevel: LogLevel, log: LogFn): LogFn =>
(level, message, context) => {
if (levels.indexOf(level) <= levels.indexOf(minLevel)) {
log(level, message, context);
}
};
const logger = createLogger(
createMinLevelLogFn('warning', (level, message, context) => {
console.log(level, message, context);
}),
);
logger.error('Shown', {});
logger.info('Suppressed', {});
Copyright
2026 Dominik Zogg