UNPKG

winston

Version:

A logger for just about everything.

126 lines (108 loc) 3.81 kB
/* eslint-disable no-console */ /* * console.js: Transport for outputting to the console. * * (C) 2010 Charlie Robbins * MIT LICENCE */ 'use strict'; const os = require('os'); const { LEVEL, MESSAGE } = require('triple-beam'); const TransportStream = require('winston-transport'); /** * Transport for outputting to the console. * @type {Console} * @extends {TransportStream} */ module.exports = class Console extends TransportStream { // Keep a reference to the log, warn, and error console methods // in case they get redirected to this transport after the logger is // instantiated. This prevents a circular reference issue. _consoleLog = console.log.bind(console); _consoleWarn = console.warn.bind(console); _consoleError = console.error.bind(console); /** * Constructor function for the Console transport object responsible for * persisting log messages and metadata to a terminal or TTY. * @param {!Object} [options={}] - Options for this instance. */ constructor(options = {}) { super(options); // Expose the name of this Transport on the prototype this.name = options.name || 'console'; this.stderrLevels = this._stringArrayToSet(options.stderrLevels); this.consoleWarnLevels = this._stringArrayToSet(options.consoleWarnLevels); this.eol = typeof options.eol === 'string' ? options.eol : os.EOL; this.forceConsole = options.forceConsole || false; this.setMaxListeners(30); } /** * Core logging method exposed to Winston. * @param {Object} info - TODO: add param description. * @param {Function} callback - TODO: add param description. * @returns {undefined} */ log(info, callback) { setImmediate(() => this.emit('logged', info)); // Remark: what if there is no raw...? if (this.stderrLevels[info[LEVEL]]) { if (console._stderr && !this.forceConsole) { // Node.js maps `process.stderr` to `console._stderr`. console._stderr.write(`${info[MESSAGE]}${this.eol}`); } else { // console.error adds a newline this._consoleError(info[MESSAGE]); } if (callback) { callback(); // eslint-disable-line callback-return } return; } else if (this.consoleWarnLevels[info[LEVEL]]) { if (console._stderr && !this.forceConsole) { // Node.js maps `process.stderr` to `console._stderr`. // in Node.js console.warn is an alias for console.error console._stderr.write(`${info[MESSAGE]}${this.eol}`); } else { // console.warn adds a newline this._consoleWarn(info[MESSAGE]); } if (callback) { callback(); // eslint-disable-line callback-return } return; } if (console._stdout && !this.forceConsole) { // Node.js maps `process.stdout` to `console._stdout`. console._stdout.write(`${info[MESSAGE]}${this.eol}`); } else { // console.log adds a newline. this._consoleLog(info[MESSAGE]); } if (callback) { callback(); // eslint-disable-line callback-return } } /** * Returns a Set-like object with strArray's elements as keys (each with the * value true). * @param {Array} strArray - Array of Set-elements as strings. * @param {?string} [errMsg] - Custom error message thrown on invalid input. * @returns {Object} - TODO: add return description. * @private */ _stringArrayToSet(strArray, errMsg) { if (!strArray) return {}; errMsg = errMsg || 'Cannot make set from type other than Array of string elements'; if (!Array.isArray(strArray)) { throw new Error(errMsg); } return strArray.reduce((set, el) => { if (typeof el !== 'string') { throw new Error(errMsg); } set[el] = true; return set; }, {}); } };