Mitigate "MaxListenersExceededWarning" by reusing Logger instance

The full warning output was:
(node:43572) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 drain listeners added. Use emitter.setMaxListeners() to increase limit
(node:43572) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:43572) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 close listeners added. Use emitter.setMaxListeners() to increase limit

Change-type: patch
Signed-off-by: Paulo Castro <paulo@balena.io>
This commit is contained in:
Paulo Castro 2019-09-11 19:34:43 +01:00
parent f76ca1804a
commit 6631fb5a69
9 changed files with 26 additions and 9 deletions

View File

@ -108,7 +108,7 @@ module.exports =
helpers = require('../utils/helpers')
Logger = require('../utils/logger')
logger = new Logger()
logger = Logger.getLogger()
logger.logDebug('Parsing input...')
# `build` accepts `[source]` as a parameter, but compose expects it

View File

@ -185,7 +185,7 @@ module.exports =
helpers = require('../utils/helpers')
Logger = require('../utils/logger')
logger = new Logger()
logger = Logger.getLogger()
logger.logDebug('Parsing input...')
# when Capitano converts a positional parameter (but not an option)

View File

@ -66,7 +66,7 @@ export const join: CommandDefinition<Args, Options> = {
const Logger = await import('../utils/logger');
const promote = await import('../utils/promote');
const sdk = balena.fromSharedOptions();
const logger = new Logger();
const logger = Logger.getLogger();
return Bluebird.try(() => {
return promote.join(logger, sdk, params.deviceIp, options.application);
}).nodeify(done);

View File

@ -51,7 +51,7 @@ export const leave: CommandDefinition<Args, {}> = {
const Logger = await import('../utils/logger');
const promote = await import('../utils/promote');
const sdk = balena.fromSharedOptions();
const logger = new Logger();
const logger = Logger.getLogger();
return Bluebird.try(() => {
return promote.leave(logger, sdk, params.deviceIp);
}).nodeify(done);

View File

@ -108,7 +108,7 @@ export const logs: CommandDefinition<
);
const Logger = await import('../utils/logger');
const logger = new Logger();
const logger = Logger.getLogger();
const servicesToDisplay =
options.service != null

View File

@ -94,7 +94,7 @@ export const tunnel: CommandDefinition<Args, Options> = {
const deviceOrApplication =
params.deviceOrApplication_raw || params.deviceOrApplication;
const Logger = await import('../utils/logger');
const logger = new Logger();
const logger = Logger.getLogger();
const balena = await import('balena-sdk');
const sdk = balena.fromSharedOptions();

View File

@ -38,7 +38,7 @@ import { displayBuildLog } from './logs';
// Define the logger here so the debug output
// can be used everywhere
const globalLogger = new Logger();
const globalLogger = Logger.getLogger();
export interface DeviceDeployOptions {
source: string;

View File

@ -19,6 +19,13 @@ import _ = require('lodash');
import { EOL as eol } from 'os';
import { StreamLogger } from 'resin-stream-logger';
/**
* General purpose logger class with support for log streams and colours.
* Call `Logger.getLogger()` to retrieve a global shared instance of this
* class. The `new Logger()` pattern is not recommended because it may lead
* to Node printing "MaxListenersExceededWarning" warning messages to the
* console.
*/
class Logger {
public streams: {
build: NodeJS.ReadWriteStream;
@ -33,7 +40,7 @@ class Logger {
public formatMessage: (name: string, message: string) => string;
constructor() {
protected constructor() {
const logger = new StreamLogger();
logger.addPrefix('build', chalk.blue('[Build]'));
logger.addPrefix('info', chalk.cyan('[Info]'));
@ -64,6 +71,16 @@ class Logger {
this.formatMessage = logger.formatWithPrefix.bind(logger);
}
protected static logger: Logger;
/** Retrieve a global shared instance of this class */
public static getLogger() {
if (!this.logger) {
this.logger = new Logger();
}
return this.logger;
}
public logInfo(msg: string) {
return this.streams.info.write(msg + eol);
}

View File

@ -333,7 +333,7 @@ export async function getOnlineTargetUuid(
applicationOrDevice: string,
) {
const Logger = await import('../utils/logger');
const logger = new Logger();
const logger = Logger.getLogger();
const appTest = validation.validateApplicationName(applicationOrDevice);
const uuidTest = validation.validateUuid(applicationOrDevice);