# Console

    Stability: 2 - Stable

The `console` module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.

The module exports two specific components:

* A `Console` class with methods such as `console.log()`, `console.error()` and
  `console.warn()` that can be used to write to any Node.js stream.
* A global `console` instance configured to write to `stdout` and `stderr`.
  Because this object is global, it can be used without calling
  `require('console')`.

Example using the global `console`:

    console.log('hello world');
      // Prints: hello world, to stdout
    console.log('hello %s', 'world');
      // Prints: hello world, to stdout
    console.error(new Error('Whoops, something bad happened'));
      // Prints: [Error: Whoops, something bad happened], to stderr

    const name = 'Will Robinson';
    console.warn(`Danger ${name}! Danger!`);
      // Prints: Danger Will Robinson! Danger!, to stderr

Example using the `Console` class:

    const out = getStreamSomehow();
    const err = getStreamSomehow();
    const myConsole = new console.Console(out, err);

    myConsole.log('hello world');
      // Prints: hello world, to out
    myConsole.log('hello %s', 'world');
      // Prints: hello world, to out
    myConsole.error(new Error('Whoops, something bad happened'));
      // Prints: [Error: Whoops, something bad happened], to err

    const name = 'Will Robinson';
    myConsole.warn(`Danger ${name}! Danger!`);
      // Prints: Danger Will Robinson! Danger!, to err

While the API for the `Console` class is designed fundamentally around the
Web browser `console` object, the `Console` is Node.js is *not* intended to
duplicate the browsers functionality exactly.

## Asynchronous vs Synchronous Consoles

The console functions are synchronous when the destination is a terminal or
a file (to avoid lost messages in case of premature exit) and asynchronous
when the destination is a pipe (to avoid blocking for long periods of time).

In the following example, stdout is non-blocking while stderr is blocking:

    $ node script.js 2> error.log | tee info.log

Typically, the distinction between blocking/non-blocking is not important
unless an application is logging significant amounts of data. High volume
logging *should* use a `Console` instance that writes to a pipe.

## Class: Console

<!--type=class-->

The `Console` class can be used to create a simple logger with configurable
output streams and can be accessed using either `require('console').Console`
or `console.Console`:

    const Console = require('console').Console;
    const Console = console.Console;

### new Console(stdout[, stderr])

Creates a new `Console` by passing one or two writable stream instances.
`stdout` is a writable stream to print log or info output. `stderr`
is used for warning or error output. If `stderr` isn't passed, the warning
and error output will be sent to the `stdout`.

    const output = fs.createWriteStream('./stdout.log');
    const errorOutput = fs.createWriteStream('./stderr.log');
    // custom simple logger
    const logger = new Console(output, errorOutput);
    // use it like console
    var count = 5;
    logger.log('count: %d', count);
    // in stdout.log: count 5

The global `console` is a special `Console` whose output is sent to
`process.stdout` and `process.stderr`. It is equivalent to calling:

    new Console(process.stdout, process.stderr);

### console.assert(value[, message][, ...])

A simple assertion test that verifies whether `value` is truthy. If it is not,
an `AssertionError` is throw. If provided, the error `message` is formatted
using [`util.format()`][] and used as the error message.

    console.assert(true, 'does nothing');
      // OK
    console.assert(false, 'Whoops %s', 'didn\'t work');
      // AssertionError: Whoops didn't work

### console.dir(obj[, options])

Uses [`util.inspect()`][] on `obj` and prints the resulting string to stdout.
This function bypasses any custom `inspect()` function defined on `obj`. An
optional `options` object may be passed that alters certain aspects of the
formatted string:

- `showHidden` - if `true` then the object's non-enumerable and symbol
properties will be shown too. Defaults to `false`.

- `depth` - tells `inspect` how many times to recurse while formatting the
object. This is useful for inspecting large complicated objects. Defaults to
`2`. To make it recurse indefinitely, pass `null`.

- `colors` - if `true`, then the output will be styled with ANSI color codes.
Defaults to `false`. Colors are customizable; see
[customizing `util.inspect()` colors][].

### console.error([data][, ...])

Prints to stderr with newline. Multiple arguments can be passed, with the first
used as the primary message and all additional used as substitution
values similar to `printf()` (the arguments are all passed to
[`util.format()`][]).

    const code = 5;
    console.error('error #%d', code);
      // Prints: error #5, to stderr
    console.error('error', code);
      // Prints: error 5, to stderr

If formatting elements (e.g. `%d`) are not found in the first string then
[`util.inspect()`][] is called on each argument and the resulting string
values are concatenated.  See [`util.format()`][] for more information.

### console.info([data][, ...])

The `console.info()` function is an alias for [`console.log()`][].

### console.log([data][, ...])

Prints to stdout with newline. Multiple arguments can be passed, with the first
used as the primary message and all additional used as substitution
values similar to `printf()` (the arguments are all passed to
[`util.format()`][]).

    var count = 5;
    console.log('count: %d', count);
      // Prints: count: 5, to stdout
    console.log('count: ', count);
      // Prints: count: 5, to stdout

If formatting elements (e.g. `%d`) are not found in the first string then
[`util.inspect()`][] is called on each argument and the resulting string
values are concatenated.  See [`util.format()`][] for more information.

### console.time(label)

Used to calculate the duration of a specific operation. To start a timer, call
the `console.time()` method, giving it a unique `label` as the only parameter. To stop the
timer, and to get the elapsed time in milliseconds, just call the
[`console.timeEnd()`][] method, again passing the
timer's unique `label` as the parameter.

### console.timeEnd(label)

Stops a timer that was previously started by calling [`console.time()`][] and
prints the result to stdout:

    console.time('100-elements');
    for (var i = 0; i < 100; i++) {
      ;
    }
    console.timeEnd('100-elements');
    // prints 100-elements: 262ms

### console.trace(message[, ...])

Prints to stderr the string `'Trace :'`, followed by the [`util.format()`][]
formatted message and stack trace to the current position in the code.

    console.trace('Show me');
      // Prints: (stack trace will vary based on where trace is called)
      //  Trace: Show me
      //    at repl:2:9
      //    at REPLServer.defaultEval (repl.js:248:27)
      //    at bound (domain.js:287:14)
      //    at REPLServer.runBound [as eval] (domain.js:300:12)
      //    at REPLServer.<anonymous> (repl.js:412:12)
      //    at emitOne (events.js:82:20)
      //    at REPLServer.emit (events.js:169:7)
      //    at REPLServer.Interface._onLine (readline.js:210:10)
      //    at REPLServer.Interface._line (readline.js:549:8)
      //    at REPLServer.Interface._ttyWrite (readline.js:826:14)

### console.warn([data][, ...])

The `console.warn()` function is an alias for [`console.error()`][].

[`console.error()`]: #console_console_error_data
[`console.log()`]: #console_console_log_data
[`console.time()`]: #console_console_time_label
[`console.timeEnd()`]: #console_console_timeend_label
[`util.format()`]: util.html#util_util_format_format
[`util.inspect()`]: util.html#util_util_inspect_object_options
