@fdm-monster/server
Version:
FDM Monster is a bulk OctoPrint, Klipper, PrusaLink and BambuLab manager to set up, configure and monitor 3D printers. Our aim is to provide neat overview over your farm.
93 lines (92 loc) • 3.77 kB
JavaScript
import { AppConstants } from "../../server.constants.js";
import { isDevelopmentEnvironment } from "../../utils/env.utils.js";
import { createLokiLoggingTransport } from "./loki-logging.transport.js";
import { createFileLoggingTransport } from "./file-logging.transport.js";
import winston from "winston";
import process from "node:process";
//#region src/handlers/logging/static.logger.ts
let staticLogger = null;
const levelMap = {
error: "ERR",
warn: "WRN",
info: "INF",
debug: "DBG",
http: "HTT",
verbose: "VRB",
silly: "SLY"
};
const logContextClassProperty = "class";
function getStaticLogger() {
if (!staticLogger) throw new Error("Logger not yet initialized.");
return staticLogger;
}
function createStaticLogger(config) {
if (staticLogger) return;
const isProd = process.env[AppConstants.NODE_ENV_KEY] === AppConstants.defaultProductionEnv;
const isTest = process.env[AppConstants.NODE_ENV_KEY] === AppConstants.defaultTestEnv;
const effectiveLogLevel = isProd || isTest ? "warn" : "debug";
const lokiTransport = createLokiLoggingTransport({ logLevel: effectiveLogLevel });
const extraWinstonTransports = [];
if (lokiTransport) extraWinstonTransports.push(lokiTransport);
const fileLoggerTransport = createFileLoggingTransport({
enabled: config.enableFileLogs,
isTest
});
if (fileLoggerTransport) extraWinstonTransports.push(fileLoggerTransport);
staticLogger = winston.createLogger({
transports: [...extraWinstonTransports, new winston.transports.Console({
level: effectiveLogLevel,
format: winston.format.combine(...isDevelopmentEnvironment() && process.env[AppConstants.ENABLE_COLORED_LOGS_KEY] == "true" ? [
winston.format((info) => {
info.rawLevel = info.level;
return info;
})(),
winston.format.colorize({
colors: {
error: "red",
warn: "yellow",
info: "white",
debug: "gray",
http: "magenta",
verbose: "cyan",
silly: "gray"
},
level: true,
message: true,
all: false
}),
winston.format.printf((info) => {
const now = /* @__PURE__ */ new Date();
const timestamp = `${now.toISOString().split("T")[0]} ${now.toTimeString().split(" ")[0]}.${now.getMilliseconds().toString().padStart(3, "0")}`;
const levelAbbr = levelMap[info.rawLevel] ?? info.rawLevel.substring(0, 3).toUpperCase();
const gray = "\x1B[90m";
const reset = info.message.substring(0, 5) ?? "\x1B[0m";
const numberRegex = /\b\d+\b/g;
const coloredMessage = info.message.replace(numberRegex, (match) => `\x1b[35m${match}${reset}`);
let logEntry = `${gray}[${timestamp} ${reset}${levelAbbr}${reset}${gray}]${reset} ${gray}[${reset}${info["class"] ?? "unknown"}${gray}]${reset} ${coloredMessage}`;
if (info.meta) {
const coloredMeta = JSON.stringify(info.meta).replace(numberRegex, (match) => `\x1b[35m${match}${reset}`);
logEntry += ` ${coloredMeta}`;
}
return logEntry;
})
] : [])
})],
format: winston.format.printf((info) => {
const now = /* @__PURE__ */ new Date();
let message = `[${`${now.toISOString().split("T")[0]} ${now.toTimeString().split(" ")[0]}.${now.getMilliseconds().toString().padStart(3, "0")}`} ${levelMap[info.level] || `[${info.level.substring(0, 3).toUpperCase()}]`}] [${info["class"] ?? "unknown"}] ${info.message}`;
if (info.meta) {
const pascalCaseMeta = Object.entries(info.meta).reduce((acc, [key, value]) => {
const pascalKey = key.charAt(0).toUpperCase() + key.slice(1);
acc[pascalKey] = value;
return acc;
}, {});
message += ` ${JSON.stringify(pascalCaseMeta)}`;
}
return message;
})
});
}
//#endregion
export { createStaticLogger, getStaticLogger, logContextClassProperty };
//# sourceMappingURL=static.logger.js.map