UNPKG

@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
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