Logger
A logger for collecting log entries and forwarding them to one or more handlers.
import { Logger } from "@schukai/monster/source/logging/logger.mjs";Introduction
Logger is the central entry point for Monster logging. It turns log calls into LogEntry objects and forwards them to one or more handlers.
Core Responsibilities
| Surface | What it solves |
|---|---|
addHandler() | Registers a destination for structured log entries. |
removeHandler() | Stops a handler from receiving future entries. |
logInfo(), logWarn(), ... | Emit entries with explicit log levels instead of raw console calls. |
getLabel() and getLevel() | Translate between numeric log levels and stable labels. |
Why It Matters
A logger gives application code one stable surface while handlers remain free to route the same stream to the console, telemetry, memory buffers or test doubles.
Write Entries Through A Console Handler
import { Handler } from "@schukai/monster/source/logging/handler.mjs";
import { DEBUG, INFO, Logger } from "@schukai/monster/source/logging/logger.mjs";
class MemoryHandler extends Handler {
constructor(output) {
super();
this.output = output;
this.setLogLevel(DEBUG);
}
log(entry) {
if (!super.log(entry)) {
return false;
}
const line = `${entry.getLogLevel()}: ${entry.getArguments().join(" ")}`;
this.output.textContent += `${line}\n`;
return true;
}
}
const output = document.getElementById("logger-output");
const logger = new Logger().addHandler(new MemoryHandler(output));
document.getElementById("logger-run").addEventListener("click", () => {
output.textContent = "";
logger.info("Configuration loaded");
logger.debug("Rendering diagnostics enabled");
});Route The Same Log Entry Through Multiple Handlers
import { Handler } from "@schukai/monster/source/logging/handler.mjs";
import { Logger, DEBUG } from "@schukai/monster/source/logging/logger.mjs";
class BufferHandler extends Handler {
constructor(output) {
super();
this.output = output;
this.setLogLevel(DEBUG);
}
log(entry) {
if (!super.log(entry)) {
return false;
}
this.output.textContent += `\n${entry.getLogLevel()}:${entry.getArguments().join(" ")}`;
return true;
}
}
const primary = document.getElementById("logger-multiple-primary");
const secondary = document.getElementById("logger-multiple-secondary");
const logger = new Logger()
.addHandler(new BufferHandler(primary))
.addHandler(new BufferHandler(secondary));
document.getElementById("logger-multiple-run").addEventListener("click", () => {
primary.textContent = "primary";
secondary.textContent = "secondary";
logger.logInfo({ source: "docs" }, "Provider ready");
logger.logError({ source: "docs" }, "Socket closed");
});primary
secondary
Filter Log Output Through Handler Log Levels
import { Handler } from "@schukai/monster/source/logging/handler.mjs";
import { Logger, WARN } from "@schukai/monster/source/logging/logger.mjs";
class WarnOnlyHandler extends Handler {
constructor(output) {
super();
this.output = output;
this.setLogLevel(WARN);
}
log(entry) {
if (!super.log(entry)) {
return false;
}
this.output.textContent += `\n${entry.getLogLevel()}:${entry.getArguments().join(" ")}`;
return true;
}
}
const output = document.getElementById("logger-levels-output");
const logger = new Logger().addHandler(new WarnOnlyHandler(output));
document.getElementById("logger-levels-run").addEventListener("click", () => {
output.textContent = "waiting";
logger.logDebug({ source: "docs" }, "Debug");
logger.logInfo({ source: "docs" }, "Info");
logger.logWarn({ source: "docs" }, "Warn");
});waiting
Remove A Handler And Verify That It No Longer Receives Entries
import { Handler } from "@schukai/monster/source/logging/handler.mjs";
import { Logger, DEBUG } from "@schukai/monster/source/logging/logger.mjs";
class MemoryHandler extends Handler {
constructor(output) {
super();
this.output = output;
this.setLogLevel(DEBUG);
}
log(entry) {
if (!super.log(entry)) {
return false;
}
this.output.textContent += `\n${entry.getArguments().join(" ")}`;
return true;
}
}
const output = document.getElementById("logger-remove-output");
const logger = new Logger();
const handler = new MemoryHandler(output);
logger.addHandler(handler);
document.getElementById("logger-remove-run").addEventListener("click", () => {
output.textContent = "waiting";
logger.logInfo({ source: "docs" }, "First pass");
logger.removeHandler(handler);
logger.logInfo({ source: "docs" }, "Second pass");
});waiting
Exported
Logger, ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFFDerived from
BaseOptions
The Options listed in this section are defined directly within the class. This class is derived from several parent classes. Therefore, it inherits Options from these parent classes. If you cannot find a specific Options in this list, we recommend consulting the documentation of the Base.
Properties
The Properties listed in this section are defined directly within the class. This class is derived from several parent classes. Therefore, it inherits Properties from these parent classes. If you cannot find a specific Properties in this list, we recommend consulting the documentation of the Base.
Methods
The methods listed in this section are defined directly within the class. This class is derived from several parent classes. Therefore, it inherits methods from these parent classes. If you cannot find a specific method in this list, we recommend consulting the documentation of the Base.
Constructor
constructor()Behavioral methods
addHandler(handler)handler{handler}: handler
- {Logger}
{Error}the handler must be an instance of Handler
removeHandler(handler)handler{handler}: handler
- {Logger}
{Error}the handler must be an instance of Handler
Structural methods
getLabel(level)level{number}: level
- {string}
getLevel(label)label{string}: label
- {integer}
Other methods
logDebug()1.5.0undefined{*}: arguments
- {Logger}
logError()1.5.0undefined{*}: arguments
- {Logger}
logFatal()1.5.0undefined{*}: arguments
- {Logger}
logInfo()1.5.0undefined{*}: arguments
- {Logger}
logTrace()1.5.0undefined{*}: arguments
- {Logger}
logWarn()1.5.0undefined{*}: arguments
- {Logger}
Events
This component does not fire any public events. It may fire events that are inherited from its parent classes.