Skip to main content

Import

import { Logger, createLogger } from "bytekit/logger";

Constructor

const logger = new Logger(config?);

Config options

PropertyTypeDefaultDescription
level"debug" | "info" | "warn" | "error""info"Minimum severity level to emit
namespacestringPrefix prepended to every message
formatter(level, message, ...args) => stringCustom message formatting function
transportsTransport[]Array of output targets
silentbooleanfalseWhen true, suppresses all output

Log levels

Levels are ordered by severity. Setting a level silences everything below it.
LevelSeverity
debugLowest — verbose development output
infoGeneral operational messages
warnPotential issues worth investigating
errorHighest — failures that need attention

Methods

MethodReturnsDescription
debug(message, ...args)voidLogs at debug level
info(message, ...args)voidLogs at info level
warn(message, ...args)voidLogs at warn level
error(message, ...args)voidLogs at error level
log(level, message, ...args)voidLogs at an explicit level
setLevel(level)voidChanges the minimum level at runtime
child(namespace)LoggerCreates a child logger with a prefixed namespace
addTransport(transport)voidAdds an output target at runtime
removeTransport(transport)voidRemoves a previously added transport

Transport interface

Any object that implements the following method can be used as a transport:
interface Transport {
  log(level: string, message: string, ...args: unknown[]): void;
}

createLogger factory

Shortcut that creates and returns a Logger instance. Accepts the same config as the constructor.
const logger = createLogger({ level: "debug", namespace: "app" });

Examples

Basic usage

import { Logger } from "bytekit/logger";

const logger = new Logger({ level: "info" });

logger.info("Server started on port %d", 3000);
logger.warn("Disk usage above 90%");
logger.error("Connection to database lost");

Child loggers

Create scoped loggers that inherit the parent’s config and prepend a namespace.
const root = new Logger({ level: "debug" });
const dbLogger = root.child("db");
const httpLogger = root.child("http");

dbLogger.info("Connected to postgres");  // [db] Connected to postgres
httpLogger.debug("GET /users 200 12ms"); // [http] GET /users 200 12ms

Custom transport

const fileTransport: Transport = {
  log(level, message, ...args) {
    const line = `[${new Date().toISOString()}] ${level}: ${message}\n`;
    fs.appendFileSync("app.log", line);
  },
};

const logger = new Logger({
  level: "info",
  transports: [fileTransport],
});

Runtime level switching

const logger = new Logger({ level: "info" });

// Later, enable debug output in response to a signal
process.on("SIGUSR2", () => {
  logger.setLevel("debug");
  logger.debug("Debug logging enabled");
});

Silent mode for tests

const logger = new Logger({ silent: true });

// No output — useful in test suites
logger.error("This is suppressed");
Use child() to give each module its own namespace. This makes it easy to filter logs in production without changing log levels globally.
The default transport writes to console. Add custom transports to send logs to files, remote services, or monitoring tools.