2025-01-02 17:03:52 -06:00
|
|
|
import {
|
2025-01-07 08:48:37 -06:00
|
|
|
flattenMessage,
|
2025-01-02 17:03:52 -06:00
|
|
|
LogLevel,
|
|
|
|
LogMessage,
|
|
|
|
LogMessageFormatter,
|
2025-01-07 09:30:21 -06:00
|
|
|
} from "./log-message";
|
|
|
|
import { LogAppender } from "./log-appender";
|
2020-08-07 08:54:06 -05:00
|
|
|
|
2025-01-07 09:30:21 -06:00
|
|
|
/**
|
|
|
|
* A log appender that writes log messages to the console. The behavior of the
|
|
|
|
* log appender can be configured with a threshold level and a message
|
|
|
|
* formatter.
|
|
|
|
*
|
|
|
|
* When the message formatter returns a string value, that value is logged to
|
|
|
|
* the console as-is. When the message formatter returns an object, a summary
|
|
|
|
* string is logged to the console, followed by the object itself. This allows
|
|
|
|
* logs to be easily read in the console, while still providing the structured
|
|
|
|
* data for inspection in the browser's developer tools.
|
|
|
|
*/
|
2020-08-07 08:54:06 -05:00
|
|
|
export class ConsoleLogAppender implements LogAppender {
|
|
|
|
public threshold = LogLevel.ALL;
|
2025-01-07 09:30:21 -06:00
|
|
|
public formatter: LogMessageFormatter = flattenMessage;
|
2020-08-07 08:54:06 -05:00
|
|
|
|
2025-01-02 17:03:52 -06:00
|
|
|
constructor(threshold?: LogLevel, formatter?: LogMessageFormatter) {
|
2020-08-07 08:54:06 -05:00
|
|
|
if (threshold) {
|
|
|
|
this.threshold = threshold;
|
|
|
|
}
|
2025-01-02 17:03:52 -06:00
|
|
|
if (formatter) {
|
|
|
|
this.formatter = formatter;
|
|
|
|
}
|
2020-08-07 08:54:06 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
public appendMessage(msg: LogMessage): void {
|
|
|
|
if (this.threshold && msg.level < this.threshold) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let logMethod = console.log;
|
|
|
|
switch (msg.level) {
|
|
|
|
case LogLevel.ALL:
|
|
|
|
case LogLevel.TRACE:
|
2025-01-07 09:30:21 -06:00
|
|
|
case LogLevel.LOG:
|
2020-08-07 08:54:06 -05:00
|
|
|
logMethod = console.log;
|
|
|
|
break;
|
|
|
|
case LogLevel.DEBUG:
|
|
|
|
logMethod = console.debug;
|
|
|
|
break;
|
|
|
|
case LogLevel.INFO:
|
|
|
|
logMethod = console.info;
|
|
|
|
break;
|
|
|
|
case LogLevel.WARN:
|
|
|
|
logMethod = console.warn;
|
|
|
|
break;
|
|
|
|
case LogLevel.ERROR:
|
|
|
|
case LogLevel.FATAL:
|
|
|
|
logMethod = console.trace;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2025-01-07 09:30:21 -06:00
|
|
|
const fmtMsg = this.formatter(msg);
|
2025-01-02 17:03:52 -06:00
|
|
|
|
2025-01-07 09:30:21 -06:00
|
|
|
if (typeof fmtMsg === "string") {
|
|
|
|
if (msg.error || msg.stacktrace) {
|
|
|
|
logMethod(fmtMsg, msg.error ?? msg.stacktrace);
|
|
|
|
} else {
|
|
|
|
logMethod(fmtMsg);
|
|
|
|
}
|
2020-08-07 08:54:06 -05:00
|
|
|
} else {
|
2025-01-07 09:30:21 -06:00
|
|
|
const { message, _error, _stacktrace, ...rest } = fmtMsg;
|
|
|
|
const summary = `${LogLevel[msg.level]} -- ${msg.scope}: ${
|
|
|
|
message ?? fmtMsg.method
|
|
|
|
}\n`;
|
|
|
|
|
|
|
|
if (msg.error || msg.stacktrace) {
|
|
|
|
logMethod(summary, msg.error ?? msg.stacktrace, rest);
|
|
|
|
} else {
|
|
|
|
logMethod(summary, rest);
|
|
|
|
}
|
2020-08-07 08:54:06 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default ConsoleLogAppender;
|