UNPKG

@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
"use strict"; 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;