@lexamica-modules/logger
Version:
The various loggers and transports used for API logging in the Lexamica Eco-system
205 lines (204 loc) • 8.81 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Loggers = exports.routeLogger = exports.integrationLogger = exports.userLogger = exports.taskLogger = exports.authLogger = void 0;
const logform_1 = require("logform");
const environment_1 = require("./environment");
const winston_1 = __importDefault(require("winston"));
const formatting_1 = require("./formatting");
const winston_slack_webhook_transport_1 = __importDefault(require("winston-slack-webhook-transport"));
const winston_datadog_logs_transport_1 = __importDefault(require("@shelf/winston-datadog-logs-transport"));
/**
*
* @param dataDogApiKey {string}
* @param service {string}
* @param defaultLevel { "silly" |'debug" |"verbose" | "info" | "warning" | "error" | }
* @param environment { string }
* @param formatType {"color" | "json" }
* @param consoleParams { winston.ConsoleTransportOptions }
* @param loggerParams { winston.LoggerOptions }
* @return {winston.Logger}
*/
function createLogger({ dataDogApiKey, service, defaultLevel = 'info', environment, formatType = 'json', requireConsoleTransport = false, requireDataDogTransport = false, consoleParams, loggerParams, metadata = {}, slackWebhook, slackLogLevel, options, }) {
if (!dataDogApiKey &&
(!(0, environment_1.isDevelopment)(environment) || requireDataDogTransport)) {
throw new Error(`Must provide a dataDogApiKey for logger in staging, demo, and production environments`);
}
const transports = [];
if ((0, environment_1.isDevelopment)(environment) || requireConsoleTransport) {
transports.push(new winston_1.default.transports.Console({
...consoleParams,
handleExceptions: true,
}));
}
if ((0, environment_1.isProduction)(environment) && !!slackWebhook) {
const transport = new winston_slack_webhook_transport_1.default({
webhookUrl: slackWebhook,
level: slackLogLevel ?? 'info',
});
transports.push(transport);
}
if ((0, environment_1.isDevelopment)(environment) && !!options?.development?.slack_webhook) {
const transport = new winston_slack_webhook_transport_1.default({
webhookUrl: options.development.slack_webhook,
level: slackLogLevel ?? 'info',
});
transports.push(transport);
}
if ((0, environment_1.isStaging)(environment) && !!options?.staging?.slack_webhook) {
const transport = new winston_slack_webhook_transport_1.default({
webhookUrl: options.staging.slack_webhook,
level: slackLogLevel ?? 'info',
});
transports.push(transport);
}
if (!(0, environment_1.isDevelopment)(environment) || requireDataDogTransport) {
transports.push(new winston_datadog_logs_transport_1.default({
apiKey: dataDogApiKey,
metadata: {
...metadata,
service,
ddsource: `node:${process.version ?? '0.0.0'}`,
host: `${service}:${environment}`,
environment,
},
}));
}
return winston_1.default.createLogger({
format: (0, formatting_1.getFormat)(formatType),
level: defaultLevel || 'info',
exitOnError: false,
...loggerParams,
transports,
});
}
/**
* Logger initialization function
* @param datadog_key the API key to connect to datadog via transporter
* @param service a service string. Typically an API name or some other id
* @param environment the usage environment. Use the NODE_ENV env var
* @param slack_webhook give the webook url to transport these logs to a slack channel
* @returns {winston.Logger}
*/
const authLogger = (datadog_key, service, environment, slack_webhook, defaultLevel, options) => createLogger({
service: `${service}/auth`,
dataDogApiKey: datadog_key,
defaultLevel,
environment: environment,
consoleParams: (0, environment_1.isDevelopment)(environment)
? {
format: logform_1.format.printf(({ message }) => message),
}
: {},
loggerParams: {},
slackWebhook: slack_webhook,
options,
});
exports.authLogger = authLogger;
/**
* Logger initialization function
* @param datadog_key the API key to connect to datadog via transporter
* @param service a service string. Typically an API name or some other id
* @param environment the usage environment. Use the NODE_ENV env var
* @param slack_webhook give the webook url to transport these logs to a slack channel
* @returns {winston.Logger}
*/
const taskLogger = (datadog_key, service, environment, slack_webhook, defaultLevel, options) => createLogger({
service: `${service}/tasks`,
dataDogApiKey: datadog_key,
defaultLevel,
environment: environment,
consoleParams: (0, environment_1.isDevelopment)(environment)
? {
format: logform_1.format.printf(({ message }) => message),
}
: {},
loggerParams: {},
slackWebhook: slack_webhook,
options,
});
exports.taskLogger = taskLogger;
/**
* Logger initialization function
* @param datadog_key the API key to connect to datadog via transporter
* @param service a service string. Typically an API name or some other id
* @param environment the usage environment. Use the NODE_ENV env var
* @param slack_webhook give the webook url to transport these logs to a slack channel
* @returns {winston.Logger}
*/
const userLogger = (datadog_key, service, environment, slack_webhook, defaultLevel, options) => createLogger({
service: `${service}/users`,
dataDogApiKey: datadog_key,
defaultLevel,
environment: environment,
consoleParams: (0, environment_1.isDevelopment)(environment)
? {
format: logform_1.format.printf(({ message }) => message),
}
: {},
loggerParams: {},
slackWebhook: slack_webhook,
options,
});
exports.userLogger = userLogger;
/**
* Logger initialization function
* @param datadog_key the API key to connect to datadog via transporter
* @param service a service string. Typically an API name or some other id
* @param environment the usage environment. Use the NODE_ENV env var
* @param slack_webhook give the webook url to transport these logs to a slack channel
* @returns {winston.Logger}
*/
const integrationLogger = (datadog_key, service, environment, slack_webhook, defaultLevel, options) => createLogger({
service: `${service}/integrations`,
dataDogApiKey: datadog_key,
defaultLevel,
environment: environment,
consoleParams: (0, environment_1.isDevelopment)(environment)
? {
format: logform_1.format.printf(({ message }) => message),
}
: {},
loggerParams: {},
slackWebhook: slack_webhook,
options,
});
exports.integrationLogger = integrationLogger;
/**
* Logger initialization function
* @param datadog_key the API key to connect to datadog via transporter
* @param service a service string. Typically an API name or some other id
* @param environment the usage environment. Use the NODE_ENV env var
* @returns {winston.Logger}
*/
const routeLogger = (datadog_key, service, environment, defaultLevel, options) => createLogger({
service: `${service}/routes`,
dataDogApiKey: datadog_key,
defaultLevel,
environment: environment,
consoleParams: (0, environment_1.isDevelopment)(environment)
? {
format: logform_1.format.printf(({ message }) => message),
}
: {},
loggerParams: {},
options,
});
exports.routeLogger = routeLogger;
class Loggers {
RouteLogger;
TaskLogger;
UserLogger;
IntegrationLogger;
AuthLogger;
constructor(datadog_api_key, service, environment, slack_user_logs_webhook, slack_task_logs_webhook, slack_auth_logs_webhook, slack_integration_logs_webhook, defaultLevel = 'info', options = {}) {
this.RouteLogger = (0, exports.routeLogger)(datadog_api_key, service, environment, defaultLevel, options.route);
this.TaskLogger = (0, exports.taskLogger)(datadog_api_key, service, environment, slack_task_logs_webhook, defaultLevel, options.task);
this.UserLogger = (0, exports.userLogger)(datadog_api_key, service, environment, slack_user_logs_webhook, defaultLevel, options.user);
this.IntegrationLogger = (0, exports.integrationLogger)(datadog_api_key, service, environment, slack_integration_logs_webhook, defaultLevel, options.integration);
this.AuthLogger = (0, exports.authLogger)(datadog_api_key, service, environment, slack_auth_logs_webhook, defaultLevel, options.auth);
}
}
exports.Loggers = Loggers;