Universal pluggable logging utility with configurable levels and namespacing support
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Universal 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;
}