mirror of
https://github.com/balena-io/balena-cli.git
synced 2025-03-21 03:25:37 +00:00
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:
parent
f76ca1804a
commit
6631fb5a69
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user