diff --git a/doc/api/console.md b/doc/api/console.md index db3a903eaf8a56..99c31df242a19b 100644 --- a/doc/api/console.md +++ b/doc/api/console.md @@ -79,17 +79,22 @@ const { Console } = console; ``` ### new Console(stdout[, stderr][, ignoreErrors]) +### new Console(options) -* `stdout` {stream.Writable} -* `stderr` {stream.Writable} -* `ignoreErrors` {boolean} Ignore errors when writing to the underlying streams. - Defaults to `true`. +* `options` {Object} + * `stdout` {stream.Writable} + * `stderr` {stream.Writable} + * `ignoreErrors` {boolean} Ignore errors when writing to the underlying + streams. **Default:** `true`. Creates a new `Console` with one or two writable stream instances. `stdout` is a writable stream to print log or info output. `stderr` is used for warning or @@ -99,7 +104,7 @@ error output. If `stderr` is not provided, `stdout` is used for `stderr`. const output = fs.createWriteStream('./stdout.log'); const errorOutput = fs.createWriteStream('./stderr.log'); // custom simple logger -const logger = new Console(output, errorOutput); +const logger = new Console({ stdout: output, stderr: errorOutput }); // use it like console const count = 5; logger.log('count: %d', count); @@ -110,7 +115,7 @@ The global `console` is a special `Console` whose output is sent to [`process.stdout`][] and [`process.stderr`][]. It is equivalent to calling: ```js -new Console(process.stdout, process.stderr); +new Console({ stdout: process.stdout, stderr: process.stderr }); ``` ### console.assert(value[, ...message]) diff --git a/lib/console.js b/lib/console.js index 456c0cc439f740..9557b27fbcabf9 100644 --- a/lib/console.js +++ b/lib/console.js @@ -51,16 +51,28 @@ const { // Track amount of indentation required via `console.group()`. const kGroupIndent = Symbol('groupIndent'); -function Console(stdout, stderr, ignoreErrors = true) { +function Console(options /* or: stdout, stderr, ignoreErrors = true */) { if (!(this instanceof Console)) { - return new Console(stdout, stderr, ignoreErrors); + return new Console(...arguments); } + + let stdout, stderr, ignoreErrors; + if (options && typeof options.write !== 'function') { + ({ + stdout, + stderr = stdout, + ignoreErrors = true + } = options); + } else { + stdout = options; + stderr = arguments[1]; + ignoreErrors = arguments[2] === undefined ? true : arguments[2]; + } + if (!stdout || typeof stdout.write !== 'function') { throw new ERR_CONSOLE_WRITABLE_STREAM('stdout'); } - if (!stderr) { - stderr = stdout; - } else if (typeof stderr.write !== 'function') { + if (!stderr || typeof stderr.write !== 'function') { throw new ERR_CONSOLE_WRITABLE_STREAM('stderr'); } @@ -369,7 +381,10 @@ Console.prototype.table = function(tabularData, properties) { return final(keys, values); }; -module.exports = new Console(process.stdout, process.stderr); +module.exports = new Console({ + stdout: process.stdout, + stderr: process.stderr +}); module.exports.Console = Console; function noop() {}