Logger
Shared logging interface for the Kysera ecosystem. All packages can optionally accept this logger for consistent logging across your application.
Installation
npm install @kysera/core
API Reference
KyseraLogger Interface
interface KyseraLogger {
debug(message: string, ...args: unknown[]): void;
info(message: string, ...args: unknown[]): void;
warn(message: string, ...args: unknown[]): void;
error(message: string, ...args: unknown[]): void;
}
A simple interface that any logging library can implement.
consoleLogger
import { consoleLogger } from '@kysera/core'
consoleLogger.debug('Fetching user', { id: 1 })
// Output: [kysera:debug] Fetching user { id: 1 }
consoleLogger.info('User created')
// Output: [kysera:info] User created
consoleLogger.warn('Deprecated method used')
// Output: [kysera:warn] Deprecated method used
consoleLogger.error('Failed to connect', error)
// Output: [kysera:error] Failed to connect Error: ...
Built-in console logger with [kysera:level] prefixes.
silentLogger
import { silentLogger } from '@kysera/core'
// No output - useful for testing or disabling logging
silentLogger.debug('This will not print')
silentLogger.info('Neither will this')
No-op logger for silent operation. Useful for:
- Unit tests where logging output is noise
- Production environments where you want to disable verbose logging
- Performance-critical code paths
createPrefixedLogger
import { createPrefixedLogger, consoleLogger } from '@kysera/core'
const userLogger = createPrefixedLogger('UserService', consoleLogger)
userLogger.info('Creating user')
// Output: [kysera:info] [UserService] Creating user
userLogger.error('User not found', { id: 123 })
// Output: [kysera:error] [UserService] User not found { id: 123 }
Parameters:
prefix- String prefix to add to all messagesbaseLogger- Base logger to wrap (defaults toconsoleLogger)
Returns: KyseraLogger - A new logger with the prefix applied
Integration Examples
With Debug Module
import { withDebug } from '@kysera/debug'
import { createPrefixedLogger } from '@kysera/core'
const debugDb = withDebug(db, {
logger: createPrefixedLogger('SQL')
})
With Health Monitor
import { HealthMonitor } from '@kysera/infra'
import { createPrefixedLogger } from '@kysera/core'
const monitor = new HealthMonitor({
interval: 30_000,
logger: createPrefixedLogger('HealthCheck')
})
Custom Logger Implementation
Integrate with your preferred logging library:
import pino from 'pino'
import type { KyseraLogger } from '@kysera/core'
const pinoLogger = pino({ level: 'debug' })
const kyseraLogger: KyseraLogger = {
debug: (msg, ...args) => pinoLogger.debug({ args }, msg),
info: (msg, ...args) => pinoLogger.info({ args }, msg),
warn: (msg, ...args) => pinoLogger.warn({ args }, msg),
error: (msg, ...args) => pinoLogger.error({ args }, msg),
}
Winston Integration
import winston from 'winston'
import type { KyseraLogger } from '@kysera/core'
const winstonLogger = winston.createLogger({
level: 'debug',
transports: [new winston.transports.Console()]
})
const kyseraLogger: KyseraLogger = {
debug: (msg, ...args) => winstonLogger.debug(msg, ...args),
info: (msg, ...args) => winstonLogger.info(msg, ...args),
warn: (msg, ...args) => winstonLogger.warn(msg, ...args),
error: (msg, ...args) => winstonLogger.error(msg, ...args),
}
Best Practices
1. Use Prefixed Loggers for Services
class UserService {
private logger = createPrefixedLogger('UserService')
async getUser(id: string) {
this.logger.debug('Fetching user', { id })
// ...
}
}
2. Use Silent Logger in Tests
import { silentLogger } from '@kysera/core'
const service = new MyService({
logger: silentLogger
})
3. Environment-Based Logging
import { consoleLogger, silentLogger } from '@kysera/core'
const logger = process.env.NODE_ENV === 'test'
? silentLogger
: consoleLogger
Related
- Debug Module - Query profiling with logging
- Health Module - Health monitoring with logging