import { createLogger, format, transports as winstonTransports } from 'winston' import Transport from 'winston-transport' import { DataDogTransportOptions, Logger } from './types' import { RollbarTransport } from './rollbar' import { DataDogTransport } from './datadog' import { isNextJSLog } from './utils/nextjs-log-helpers' const defaultFormat = format.combine(format.timestamp(), format.prettyPrint(), format.simple()) const transports: Transport[] = [ // Ignores all NextJS logs and outputs logs generated by us in a JSON format new winstonTransports.Console({ format: format((info) => (isNextJSLog(info) ? false : info))(), }), ] if (process.env.POST_SERVER_ITEM_ACCESS_TOKEN) { transports.push( // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore new RollbarTransport({ level: 'error', format: format((info) => (isNextJSLog(info) ? false : info))(), }), ) } if (process.env.EXTERNAL_LOGGER === 'datadog') { const apiKey = process.env.DATADOG_API_KEY const intakeUrl = process.env.DATADOG_INTAKE_URL if (!apiKey || !apiKey.length) { console.error('DATADOG_API_KEY must be set if EXTERNAL_LOGGER=datadog') } else if (!intakeUrl || !intakeUrl.length) { console.error('DATADOG_INTAKE_URL must be set if EXTERNAL_LOGGER=datadog') } else { const options: DataDogTransportOptions = { apiKey, intakeUrl, hostname: process.env.DATADOG_HOSTNAME, service: process.env.DATADOG_SERVICE, level: process.env.DATADOG_LOG_LEVEL || undefined, ddtags: process.env.DATADOG_TAGS || undefined, format: defaultFormat, siteState: process.env.SITE_STATE || undefined, storefrontVersion: process.env.STOREFRONT_VERSION || undefined, } // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore transports.push(new DataDogTransport(options)) } } const defaultLogger = createLogger({ level: process.env.LOG_LEVEL || 'info', defaultMeta: { circleJob: process.env.CIRCLE_JOB, siteId: process.env.SITE_ID, releaseVersion: process.env.RELEASE_VERSION, }, format: defaultFormat, transports, }) const loggers: Record Logger> = { production: () => defaultLogger, development: () => defaultLogger, test: () => createLogger({ silent: true, }), } const logger = loggers[process.env.NODE_ENV || 'development']() export { logger }