Logger#
Zero-dependency logger built into @buntok/core. Text format in development (colorized), JSON in production. Env-driven, supports file logging.
Basic Usage#
typescript
import { logger, Logger, LogLevel } from "@buntok/core/helpers";
logger.info("Server started", { port: 1212 });
logger.warn("High memory usage", { mb: 512 });
logger.error("DB connection failed", { error: err.message });
logger.debug("Verbose", { meta: 1 });
// LogLevel: DEBUG=0, INFO=1, WARN=2, ERROR=3
Logger Options#
| Option | Type | Default | Description |
|---|---|---|---|
| level | LogLevel | INFO (dev) / WARN (prod) | Min level to output |
| format | "text" | "json" | "text" (dev) / "json" (prod) | Output format |
| logRequests | boolean | false (prod) / true (dev) | Log every request (method + path + status). Disabled in production for performance. |
typescript
import { Logger, LogLevel } from "@buntok/core/helpers";
const custom = new Logger({
level: LogLevel.DEBUG,
format: "json",
logRequests: false,
});
custom.info("Hello", { user: "Alice" });
Environment Variables#
| Variable | Effect |
|---|---|
| NODE_ENV=production | JSON format + WARN level (vs text + INFO) |
| LOG_DIR=./logs | Write logs to file: app-YYYY-MM-DD.log (JSON lines), auto mkdir |
| LOG_REQUESTS=true | Enable request logging (disabled by default in production for performance) |
Info
LOG_DIR creates daily files app-YYYY-MM-DD.log via appendFile. Production defaults to JSON lines with timestamp, level, message, ...meta.Disabling the Logger#
Silence all logger output in one call with app.disable("logger") - request logs, error/warn logs, and the startup banner (Buntok vX ready in ...).app.enable("logger") turns everything back on:
typescript
const app = new Buntok();
app.disable("logger"); // sets logger.enabled = false, logger.logRequests = false
app.listen(1212); // compiled without the request-log path - silent startup
app.enable("logger"); // restores logger.enabled = true, logger.logRequests = true
Info
Call
disable("logger") before listen() so the server compiles the request-log-free fast path; after listen() it still silences runtime logging via an eager AOT invalidation.Methods#
| Method | Description |
|---|---|
| logger.debug(msg, meta?) | DEBUG level (blue) |
| logger.info(msg, meta?) | INFO level (green) |
| logger.warn(msg, meta?) | WARN level (yellow) |
| logger.error(msg, meta?) | ERROR level (red, stderr) |
| logger.logRequests | Getter: boolean |
| logger.flushSync() | Flush buffered stdout/stderr (graceful shutdown) |
typescript
// Graceful shutdown
process.on("SIGTERM", () => {
logger.info("Shutting down");
logger.flushSync();
process.exit(0);
});Warning
Logger buffers writes via
queueMicrotask and auto-flushes. Call flushSync() before process.exit() to avoid losing last lines.