Universal pluggable logging utility with configurable levels and namespacing support
npx @tessl/cli install tessl/npm-log@6.3.0Universal pluggable logging utility that provides structured, configurable logging with level support and debug-style namespacing. Designed for maximum reusability across Node.js applications, libraries, and serverless environments.
npm install logconst log = require("log");For ES modules:
import log from "log";const log = require("log");
// Log at different levels
log("Basic info message");
log.error("Something went wrong");
log.warning("This is a warning");
log.debug("Debug information");
// Create namespaced loggers
const myLibLog = log.get("my-lib");
myLibLog.info("Info message in my-lib namespace");
// Nested namespaces
const funcLog = myLibLog.get("func");
funcLog.error("Error in my-lib:func namespace");
// Enable/disable logging
const { restore } = log.disable();
log("This won't be logged");
restore();
log("This will be logged again");The log package is built around several key components:
Primary logging functionality with five severity levels and printf-style message formatting. Supports both direct logging and level-specific methods.
// Main logger function (callable at 'info' level)
function log(message, ...args);
// Level-specific loggers
log.debug(message, ...args); // Debug level (hidden by default)
log.info(message, ...args); // Info level
log.notice(message, ...args); // Notice level
log.warning(message, ...args); // Warning level
log.warn(message, ...args); // Alias for warning
log.error(message, ...args); // Error levelDebug-lib style namespacing system for organizing logs by module, component, or feature area. Supports nested namespaces with colon separation.
// Create/get namespaced logger
log.get(namespace);
// Check namespace initialization
log.isNamespaceInitialized(namespace);
// Get all initialized namespaces
log.getAllInitializedNamespaces();Runtime control over log visibility with restore functionality. Allows temporarily disabling logs and restoring previous state.
// Control properties and methods
log.isEnabled; // boolean property
log.enable(); // returns restore object
log.disable(); // returns restore objectAbstract writer system for creating custom log output handlers. Writers subscribe to log events and handle actual output formatting and destination.
// Abstract writer constructor
new LogWriter(env, options);
// Writer registration
getMasterWriter();
getMasterWriter.register(writer);Helper functions for logger validation and type checking in applications that need to verify logger instances.
// Validation functions
isLogger(logger); // boolean check
ensureLogger(logger); // throws if invalid// Logger instance properties
interface Logger {
// Callable function
(message, ...args): void;
// Level properties
level: string; // e.g., 'info', 'error'
levelIndex: number; // severity index (0=error, 4=debug)
levelRoot: Logger; // root logger for this level
// Namespace properties
namespace: string | null; // full namespace or null
namespaceTokens: string[]; // namespace components
// Control properties
isEnabled: boolean; // visibility state
// Level loggers
debug: Logger;
info: Logger;
notice: Logger;
warning: Logger;
warn: Logger; // alias for warning
error: Logger;
// Methods (see capability docs for details)
get(namespace: string): Logger;
isNamespaceInitialized(namespace: string): boolean;
getAllInitializedNamespaces(): Logger[];
isLevelInitialized(level: string): boolean;
getAllInitializedLevels(): Logger[];
enable(): RestoreObject;
disable(): RestoreObject;
}
interface RestoreObject {
restore(): void;
}
interface LogWriter {
constructor(env: object, options?: object);
writeMessage(event: LogEvent): void;
isLoggerEnabled(logger: Logger): boolean;
setupLevelLogger(logger: Logger): void;
}
interface LogEvent {
logger: Logger;
messageTokens: any[];
message?: string;
}