in logger.js [37:143]
function Logger(opts) {
if (!(this instanceof Logger)) {
return new Logger(opts);
}
var self = this;
if (!opts) {
throw errors.OptsRequired();
}
if (!opts.meta) {
throw errors.MetaRequired();
}
if (!opts.backends) {
throw errors.BackendsRequired();
}
EventEmitter.call(this);
var meta = this.meta = opts.meta;
var transforms = opts.transforms || [];
var basemetaTransforms = opts.basemetaTransforms || [];
basemetaTransforms.forEach(function initTransforms(transform) {
transforms.push(transform(meta));
});
transforms.push(safeSerializeMeta);
transforms.push(serializableErrorTransform);
transforms.push(writePidAndHost(meta));
this.statsd = opts.statsd;
this.path = opts.path = "";
// Performs a deep copy of the default log levels, overlaying the
// configured levels and filtering nulled levels.
var levels = this.levels = {};
var configuredLevels = extend(defaultLevels, opts.levels || {});
Object.keys(configuredLevels)
.forEach(function copyDefaultLevel(levelName) {
// Setting a level in opts.levels to null disables that level.
if (!configuredLevels[levelName]) {
return;
}
// Each log level will contain an array of transforms by default,
// that will be suffixed with globally configured transforms.
var level = extend({transforms: []}, configuredLevels[levelName]);
level.transforms = level.transforms.concat(transforms);
levels[levelName] = level;
});
// Create a log level method, e.g., info(message, meta, cb?), for every
// configured log level.
Object.keys(levels)
.forEach(function makeMethodForLevel(levelName) {
self[levelName] = makeLogMethod(levelName);
});
// Create a stream for each of the configured backends, indexed by backend
// name.
// streams: Object<backendName, Stream>
var streams = this.streams = Object.keys(opts.backends)
.reduce(function accumulateStreams(streamByBackend, backendName) {
var backend = opts.backends[backendName];
if (!backend) {
return streamByBackend;
}
streamByBackend[backendName] = backend.createStream(meta, {
highWaterMark: opts.highWaterMark || 1000
});
return streamByBackend;
}, {});
// Creates an index of all the streams that each log level will write to,
// keyed by log level.
// The index is used by the writeEntry method to look up all the target
// streams for the given level.
// The parallel write method uses the backend name to annotate errors.
// _streamsByLevel: Object<logLevel, Array<Object<backendName, Stream>>>
this._streamsByLevel = Object.keys(levels)
.reduce(function accumulateStreamsByLevel(streamsByLevel, levelName) {
if (!levels[levelName]) {
return streamsByLevel;
}
var level = levels[levelName];
streamsByLevel[levelName] = level.backends
.reduce(function accumulateStreamsByBackend(
levelStreams,
backendName
) {
if (streams[backendName]) {
levelStreams.push({
name: backendName,
stream: streams[backendName]
});
}
return levelStreams;
}, []);
return streamsByLevel;
}, {});
}