'use strict'; const _ = require('lodash'); const bunyan = require('bunyan'); const raven = require('raven'); const sentryStream = require('bunyan-sentry-stream'); const PrettyStream = require('bunyan-prettystream'); const SensitiveDataStream = require('./streams/sensitive-data'); const serializers = require('./serializers'); const defaultConfig = { logger: { name: process.env.LOGGER_NAME || 'Development logger', level: process.env.LOGGER_LEVEL || 'info', pretty: process.env.USE_BUNYAN_PRETTY_STREAM === 'true', hideSensitiveData: process.env.LOGGER_USE_SENSITIVE_DATA_STREAM !== 'false', sensitiveDataPattern: process.env.LOGGER_SENSITIVE_DATA_PATTERN, }, sentry: { dsn: process.env.SENTRY_DSN, release: undefined, environment: process.env.NODE_ENV || 'development', }, }; function init(config) { const finalConfig = _.defaultsDeep(config, defaultConfig); const loggerName = finalConfig.logger.name; const loggerLevel = finalConfig.logger.level; const loggerConfig = { name: loggerName, level: loggerLevel, streams: [], serializers: { err: serializers.err, }, }; if (finalConfig.logger.pretty) { const prettyStdOut = new PrettyStream(); prettyStdOut.pipe(process.stdout); loggerConfig.streams.push({ type: 'raw', level: loggerLevel, stream: prettyStdOut, }); } else if (finalConfig.logger.hideSensitiveData) { loggerConfig.streams.push({ level: loggerLevel, stream: new SensitiveDataStream(finalConfig.logger.sensitiveDataPattern), }); } else { loggerConfig.streams.push({ level: loggerLevel, stream: process.stdout }); } if (finalConfig.sentry && finalConfig.sentry.dsn) { const client = new raven.Client(finalConfig.sentry.dsn, { name: loggerName, release: finalConfig.sentry.release, environment: finalConfig.sentry.environment, }); client.install(); loggerConfig.streams.push(sentryStream(client)); } return bunyan.createLogger(loggerConfig); } const logger = init(defaultConfig); module.exports = logger; module.exports.init = init;