File size: 2,135 Bytes
befd7da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
'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;