sipp
Version:
An Opinionated, High-Productivity MVC Web Framework in TypeScript
194 lines • 6.43 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fileTransport = exports.consoleTransport = exports.formats = exports.Logger = exports.LOG_LEVELS = void 0;
const winston_1 = __importStar(require("winston"));
const path_1 = require("path");
const triple_beam_1 = require("triple-beam");
const async_store_1 = require("../utils/async-store");
const { combine, timestamp, colorize, errors, printf } = winston_1.format;
const STORAGE_KEY = 'logger-storage-key';
const defaultOptions = {
service: 'sipp',
};
var LOG_LEVELS;
(function (LOG_LEVELS) {
LOG_LEVELS["EMERGENCY"] = "emergency";
LOG_LEVELS["ALERT"] = "alert";
LOG_LEVELS["CRITICAL"] = "critical";
LOG_LEVELS["ERROR"] = "error";
LOG_LEVELS["WARN"] = "warning";
LOG_LEVELS["NOTICE"] = "notice";
LOG_LEVELS["INFO"] = "info";
LOG_LEVELS["DEBUG"] = "debug";
})(LOG_LEVELS = exports.LOG_LEVELS || (exports.LOG_LEVELS = {}));
function toString(val) {
if (typeof val === 'string') {
return val;
}
if (val && typeof val.toString === 'function') {
return JSON.stringify(val);
}
return 'undefined';
}
class Logger {
constructor(mode, logger, opt = defaultOptions) {
this.mode = mode;
this.logger = logger;
this.opt = opt;
this.logger.format = this.fmt();
}
static new(mode) {
const prodMode = mode === 'production';
return new Logger(mode, winston_1.default.createLogger({
level: prodMode ? LOG_LEVELS.ERROR : LOG_LEVELS.INFO,
levels: winston_1.default.config.syslog.levels,
transports: prodMode
? [exports.consoleTransport, exports.fileTransport]
: [exports.consoleTransport],
}));
}
addScope(scoping, force) {
const store = async_store_1.getStore();
if (store) {
const currentScope = store.get(STORAGE_KEY) || {};
Object.keys(scoping).forEach((key) => {
if (!{}.hasOwnProperty.call(this.opt, key) || force) {
currentScope[key] = scoping[key];
}
});
store.set(STORAGE_KEY, currentScope);
}
else {
this.warn('addScope called outside of async/req context');
}
}
emergency(msg) {
this.log(LOG_LEVELS.EMERGENCY, msg);
return this;
}
alert(msg) {
this.log(LOG_LEVELS.ALERT, msg);
return this;
}
critical(msg) {
this.log(LOG_LEVELS.CRITICAL, msg);
return this;
}
error(msg) {
this.log(LOG_LEVELS.ERROR, msg);
return this;
}
warn(msg) {
this.log(LOG_LEVELS.WARN, msg);
return this;
}
notice(msg) {
this.log(LOG_LEVELS.NOTICE, msg);
return this;
}
info(msg) {
this.log(LOG_LEVELS.INFO, msg);
return this;
}
debug(msg) {
this.log(LOG_LEVELS.DEBUG, msg);
return this;
}
setServiceLabel(label) {
this.opt.service = label;
}
setLevel(level) {
this.logger.transports.forEach((transport) => {
transport.level = level;
});
return this;
}
addTransport(transport) {
this.logger.add(transport);
return this;
}
setTransport(transport) {
this.logger.clear().add(transport);
return this;
}
log(level, message) {
const store = async_store_1.hasStore() ? async_store_1.getStore() : null;
return this.logger.log(Object.assign({
level,
message,
}, store ? store.get(STORAGE_KEY) : {}));
}
fmt() {
if (!this.formatter) {
this.formatter =
this.mode === 'production'
? this.productionFormatter()
: this.developmentFormatter();
}
return this.formatter;
}
productionFormatter() {
return combine(timestamp(), this.addServiceLabel(), this.createMachineParseableFormatter());
}
addServiceLabel() {
return {
transform: (info) => {
if (this.opt.service) {
info.svc = this.opt.service;
}
return info;
},
};
}
developmentFormatter() {
return combine(timestamp(), colorize(), this.addServiceLabel(), errors(), printf((info) => {
const { level, svc, message } = info;
return `${level}${svc ? ` (${svc})` : ''}: ${message}`;
}));
}
createMachineParseableFormatter() {
return {
transform: (info) => {
const message = Object.keys(info)
.sort()
.map((key) => {
return `${key}="${toString(info[key])}"`;
})
.filter((x) => x)
.join(' ');
info.message = message;
info[triple_beam_1.MESSAGE] = message;
return info;
},
};
}
}
exports.Logger = Logger;
exports.formats = winston_1.format;
exports.consoleTransport = new winston_1.default.transports.Console({
level: process.env.NODE_ENV === 'production' ? LOG_LEVELS.ERROR : LOG_LEVELS.DEBUG,
});
exports.fileTransport = new winston_1.default.transports.File({
level: process.env.NODE_ENV === 'production' ? LOG_LEVELS.ERROR : LOG_LEVELS.DEBUG,
filename: path_1.join(process.cwd(), 'tmp', 'combined.log'),
});
//# sourceMappingURL=index.js.map