lorin
Version:
Lorin is a lightweight, dependency-free Express.js middleware for colorful, categorized logging of API requests, with both console output and file storage.
113 lines (109 loc) • 3.75 kB
JavaScript
// src/logger.ts
import { writeFile } from "fs/promises";
import { existsSync, mkdirSync } from "fs";
// src/config.ts
var colorize = (...args) => ({
red: `\x1B[31m${args.join(" ")}\x1B[0m`,
// ERROR (Red Text)
green: `\x1B[32m${args.join(" ")}\x1B[0m`,
// SUCCESS (Green Text)
cyan: `\x1B[36m${args.join(" ")}\x1B[0m`,
// INFO (Cyan Text)
yellow: `\x1B[33m${args.join(" ")}\x1B[0m`,
// WARN (Yellow Text)
bgCyan: `\x1B[46;30m${args.join(" ")}\x1B[0m`,
// INFO Label (Cyan BG, Black Text)
bgGreen: `\x1B[42;30m${args.join(" ")}\x1B[0m`,
// SUCCESS Label (Green BG, Black Text)
bgYellow: `\x1B[43;30m${args.join(" ")}\x1B[0m`,
// WARN Label (Yellow BG, Black Text)
bgRed: `\x1B[41;37m${args.join(" ")}\x1B[0m`,
// ERROR Label (Red BG, White Text)
default: `\x1B[0m${args.join(" ")}`
// Default Reset
});
var LOG_DIR = ".logs";
// src/logger.ts
var logger = {
/**
* Logs an informational message to both console and the 'info.log' file.
* The message is colorized in cyan.
*
* @param message - The message to log.
*/
info: (message) => loggerWithType(message, "INFO"),
/**
* Logs an error message to both console and the 'error.log' file.
* The message is colorized in red.
*
* @param message - The error message to log.
*/
error: (message) => loggerWithType(message, "ERROR"),
/**
* Logs a warning message to both console and the 'warn.log' file.
* The message is colorized in yellow.
*
* @param message - The warning message to log.
*/
warn: (message) => loggerWithType(message, "WARN"),
/**
* Logs a success message to both console and the 'success.log' file.
* The message is colorized in green.
*
* @param message - The success message to log.
*/
success: (message) => loggerWithType(message, "SUCCESS")
};
var LOG_RECORDS = {
INFO: { filePath: `${LOG_DIR}/info.log`, color: "cyan" },
ERROR: { filePath: `${LOG_DIR}/error.log`, color: "red" },
WARN: { filePath: `${LOG_DIR}/warn.log`, color: "yellow" },
SUCCESS: { filePath: `${LOG_DIR}/success.log`, color: "green" }
};
function loggerWithType(message, logType = "INFO") {
const { filePath, color } = LOG_RECORDS[logType];
logMessageToConsoleAndFile(message, filePath, color, {
label: logType
});
}
function logMessageToConsoleAndFile(message, filePath, color = "cyan", options = null) {
const timeStamp = (/* @__PURE__ */ new Date()).toLocaleString("sv-SE");
const logMessage = `[${timeStamp}] ${message}
`;
if (options?.label) {
const bgColor = color.replace(
/^[a-z]/,
(match) => `bg${match.toUpperCase()}`
);
console.log(
`[${timeStamp}]`,
colorize(options.label + ":")[bgColor],
colorize(message)[color]
);
} else console.log(`[${timeStamp}]`, colorize(message)[color]);
if (!existsSync(LOG_DIR)) {
mkdirSync(LOG_DIR);
writeFile(`${LOG_DIR}/.gitignore`, `# auto generated by lorin
*`);
}
writeFile(filePath, logMessage, { flag: "a" }).catch(console.error);
}
// src/logger.middleware.ts
var loggerMiddleware = (req, res, next) => {
const startTime = Date.now();
res.on("finish", () => {
const method = req.method;
const route = req.baseUrl + req.url;
const statusCode = res.statusCode;
const endTime = Date.now();
const logMessage = `${req.protocol}: ${method} ${route} ${statusCode} (${endTime - startTime}ms)`;
const color = statusCode >= 500 ? "bgRed" : statusCode >= 400 ? "red" : statusCode >= 300 ? "cyan" : statusCode >= 200 ? "green" : "default";
logMessageToConsoleAndFile(logMessage, ".logs/api.log", color);
});
next();
};
var logger_middleware_default = loggerMiddleware;
export {
logger,
logger_middleware_default as loggerMiddleware
};