@lexamica-modules/logger
Version:
The various loggers and transports used for API logging in the Lexamica Eco-system
49 lines (48 loc) • 2.37 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getFormat = exports.requestFormatter = void 0;
const winston_1 = __importDefault(require("winston"));
// have to use any here since morgan does not make its types available
function requestFormatter(tokens, req, res) {
return JSON.stringify({
method: tokens.method(req, res),
url: tokens.url(req, res),
status_code: Number.parseFloat(tokens.status(req, res)),
content_length: tokens.res(req, res, 'content-length'),
response_time: Number.parseFloat(tokens['response-time'](req, res)),
});
}
exports.requestFormatter = requestFormatter;
function logFormatTemplate(line) {
const { timestamp = new Date().toISOString(), label = 'logger', ...meta } = line.metadata || line || {};
const metaEmpty = Object.keys(meta).length === 0 && meta.constructor === Object;
const metaString = metaEmpty ? '' : JSON.stringify(meta, null, 2);
return `${timestamp} [${label}] ${line.level}: ${line.message} ${metaString}`;
}
const jsonToString = winston_1.default.format((entry) => {
const { message } = entry || {};
if (message instanceof Map || message instanceof Set) {
entry.message = `Map/Set keys: ${[...message.keys()].join(',')}`;
return entry;
}
else if (typeof message === 'object') {
entry.message = JSON.stringify(message);
return entry;
}
return entry;
});
const colorFormat = winston_1.default.format.combine(jsonToString(), winston_1.default.format.timestamp(), winston_1.default.format.colorize(), winston_1.default.format.splat(), winston_1.default.format.simple(), winston_1.default.format.metadata(), winston_1.default.format.printf(logFormatTemplate));
const jsonFormat = winston_1.default.format.combine(jsonToString(), winston_1.default.format.timestamp(), winston_1.default.format.splat(), winston_1.default.format.simple(), winston_1.default.format.metadata(), winston_1.default.format.json());
const getFormat = (formatType) => {
switch (formatType) {
case 'color':
return colorFormat;
case 'json':
default:
return jsonFormat;
}
};
exports.getFormat = getFormat;