115 lines
3.2 KiB
JavaScript
115 lines
3.2 KiB
JavaScript
/**
|
|
* container.js: Inversion of control container for winston logger instances.
|
|
*
|
|
* (C) 2010 Charlie Robbins
|
|
* MIT LICENCE
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const createLogger = require('./create-logger');
|
|
|
|
/**
|
|
* Inversion of control container for winston logger instances.
|
|
* @type {Container}
|
|
*/
|
|
module.exports = class Container {
|
|
/**
|
|
* Constructor function for the Container object responsible for managing a
|
|
* set of `winston.Logger` instances based on string ids.
|
|
* @param {!Object} [options={}] - Default pass-thru options for Loggers.
|
|
*/
|
|
constructor(options = {}) {
|
|
this.loggers = new Map();
|
|
this.options = options;
|
|
}
|
|
|
|
/**
|
|
* Retreives a `winston.Logger` instance for the specified `id`. If an
|
|
* instance does not exist, one is created.
|
|
* @param {!string} id - The id of the Logger to get.
|
|
* @param {?Object} [options] - Options for the Logger instance.
|
|
* @returns {Logger} - A configured Logger instance with a specified id.
|
|
*/
|
|
add(id, options) {
|
|
if (!this.loggers.has(id)) {
|
|
// Remark: Simple shallow clone for configuration options in case we pass
|
|
// in instantiated protoypal objects
|
|
options = Object.assign({}, options || this.options);
|
|
const existing = options.transports || this.options.transports;
|
|
|
|
// Remark: Make sure if we have an array of transports we slice it to
|
|
// make copies of those references.
|
|
options.transports = existing ? existing.slice() : [];
|
|
|
|
const logger = createLogger(options);
|
|
logger.on('close', () => this._delete(id));
|
|
this.loggers.set(id, logger);
|
|
}
|
|
|
|
return this.loggers.get(id);
|
|
}
|
|
|
|
/**
|
|
* Retreives a `winston.Logger` instance for the specified `id`. If
|
|
* an instance does not exist, one is created.
|
|
* @param {!string} id - The id of the Logger to get.
|
|
* @param {?Object} [options] - Options for the Logger instance.
|
|
* @returns {Logger} - A configured Logger instance with a specified id.
|
|
*/
|
|
get(id, options) {
|
|
return this.add(id, options);
|
|
}
|
|
|
|
/**
|
|
* Check if the container has a logger with the id.
|
|
* @param {?string} id - The id of the Logger instance to find.
|
|
* @returns {boolean} - Boolean value indicating if this instance has a
|
|
* logger with the specified `id`.
|
|
*/
|
|
has(id) {
|
|
return !!this.loggers.has(id);
|
|
}
|
|
|
|
/**
|
|
* Closes a `Logger` instance with the specified `id` if it exists.
|
|
* If no `id` is supplied then all Loggers are closed.
|
|
* @param {?string} id - The id of the Logger instance to close.
|
|
* @returns {undefined}
|
|
*/
|
|
close(id) {
|
|
if (id) {
|
|
return this._removeLogger(id);
|
|
}
|
|
|
|
this.loggers.forEach((val, key) => this._removeLogger(key));
|
|
}
|
|
|
|
/**
|
|
* Remove a logger based on the id.
|
|
* @param {!string} id - The id of the logger to remove.
|
|
* @returns {undefined}
|
|
* @private
|
|
*/
|
|
_removeLogger(id) {
|
|
if (!this.loggers.has(id)) {
|
|
return;
|
|
}
|
|
|
|
const logger = this.loggers.get(id);
|
|
logger.close();
|
|
this._delete(id);
|
|
}
|
|
|
|
/**
|
|
* Deletes a `Logger` instance with the specified `id`.
|
|
* @param {!string} id - The id of the Logger instance to delete from
|
|
* container.
|
|
* @returns {undefined}
|
|
* @private
|
|
*/
|
|
_delete(id) {
|
|
this.loggers.delete(id);
|
|
}
|
|
};
|