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#

OptionTypeDefaultDescription
levelLogLevelINFO (dev) / WARN (prod)Min level to output
format"text" | "json""text" (dev) / "json" (prod)Output format
logRequestsbooleanfalse (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#

VariableEffect
NODE_ENV=productionJSON format + WARN level (vs text + INFO)
LOG_DIR=./logsWrite logs to file: app-YYYY-MM-DD.log (JSON lines), auto mkdir
LOG_REQUESTS=trueEnable 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#

MethodDescription
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.logRequestsGetter: 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.