@mccann-hub/json-logger
Version:
A secure, configurable JSON logger built on Winston for Node.js and Deno applications. Supports custom log levels, structured JSON output, sensitive data sanitization, and error handling for multi-environment setups.
88 lines • 3.17 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = Logger;
const winston_1 = __importDefault(require("winston"));
const node_process_1 = __importDefault(require("node:process"));
const node_fs_1 = require("node:fs");
const sanitize_1 = __importDefault(require("./utils/sanitize"));
const levels = {
error: 0,
warn: 1,
http: 2,
info: 3,
debug: 4,
};
const loggerLevel = (env) => {
if (node_process_1.default.env.WINSTON_LEVEL) {
return node_process_1.default.env.WINSTON_LEVEL;
}
switch (env) {
case 'local-test':
return 'error';
case 'local':
case 'dev':
case 'development':
return 'debug';
default:
return 'info';
}
};
const colors = {
error: 'red',
warn: 'yellow',
http: 'magenta',
info: 'green',
debug: 'white',
};
winston_1.default.addColors(colors);
const format = (env, sensitiveKeys, prettyPrintEnvs = ['local']) => {
const sanitizeLogs = (0, sanitize_1.default)(sensitiveKeys);
return winston_1.default.format.combine(winston_1.default.format.errors({ stack: true }), winston_1.default.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }), winston_1.default.format((info) => {
const levelSym = Symbol.for('level');
const sanitizedInfo = sanitizeLogs(info);
sanitizedInfo[levelSym] = info[levelSym];
return sanitizedInfo;
})(), prettyPrintEnvs.includes(env)
? winston_1.default.format.json({ replacer: undefined, space: 2 })
: winston_1.default.format.json(), winston_1.default.format.colorize({ all: env === 'local' }));
};
const defaultTransports = [
new winston_1.default.transports.Console(),
new winston_1.default.transports.File({
filename: node_process_1.default.env.LOGGER_ERROR_PATH || './logs/error.log',
level: 'error',
}),
];
function getAppName() {
let appName;
if ((0, node_fs_1.existsSync)('./package.json')) {
appName = JSON.parse((0, node_fs_1.readFileSync)('./package.json', 'utf-8')).name;
}
else if ((0, node_fs_1.existsSync)('./deno.json')) {
appName = JSON.parse((0, node_fs_1.readFileSync)('./deno.json', 'utf-8')).name;
}
else {
appName = node_process_1.default.env.LOGGER_APP_NAME ?? '';
}
return appName;
}
function Logger(transports = defaultTransports, sensitiveKeys = ['SECRET', 'PASSWORD', 'TOKEN', 'KEY'], prettyPrintEnvs = ['local']) {
const env = node_process_1.default.env.NODE_ENV || 'development';
return winston_1.default.createLogger({
level: loggerLevel(env),
defaultMeta: {
app: getAppName(),
environment: env,
},
levels,
format: format(env, sensitiveKeys, prettyPrintEnvs),
transports,
exceptionHandlers: transports,
rejectionHandlers: transports,
exitOnError: !['local', 'dev', 'development'].includes(env),
});
}
//# sourceMappingURL=index.js.map