Mailspring/packages/nylas-core/logger.js
Juan Tejada afeb0e7b27 Create one CloudWatch stream per host
- This prevents `InvalidSequenceTokenException` when running in
production with multiple machines in an elastic beanstalk environment
- See
https://github.com/mirkokiefer/bunyan-cloudwatch/issues/1#issuecomment-193116799
2016-07-11 17:57:43 -07:00

63 lines
1.5 KiB
JavaScript

const os = require('os');
const bunyan = require('bunyan')
const createCWStream = require('bunyan-cloudwatch')
const PrettyStream = require('bunyan-prettystream');
const NODE_ENV = process.env.NODE_ENV || 'unknown'
function getLogStreams(name, env) {
if (env === 'development') {
const prettyStdOut = new PrettyStream();
prettyStdOut.pipe(process.stdout);
const stdoutStream = {
type: 'raw',
level: 'debug',
stream: prettyStdOut,
}
return [stdoutStream]
}
const stdoutStream = {
stream: process.stdout,
level: 'info',
}
const cloudwatchStream = {
stream: createCWStream({
logGroupName: `k2-${env}`,
logStreamName: `${name}-${env}-${os.hostname()}`,
cloudWatchLogsOptions: {
region: 'us-east-1',
},
}),
type: 'raw',
reemitErrorEvents: true,
}
return [stdoutStream, cloudwatchStream]
}
function createLogger(name, env = NODE_ENV) {
const childLogs = new Map()
const logger = bunyan.createLogger({
name,
serializers: bunyan.stdSerializers,
streams: getLogStreams(name, env),
})
return Object.assign(logger, {
forAccount(account = {}) {
if (!childLogs.has(account.id)) {
const childLog = logger.child({
account_id: account.id,
account_email: account.emailAddress,
})
childLogs.set(account.id, childLog)
}
return childLogs.get(account.id)
},
})
}
module.exports = {
createLogger,
}