Перейти к содержанию

Консоль

latest

Стабильность: 2 – Стабильная

API является удовлетворительным. Совместимость с npm имеет высший приоритет и не будет нарушена, кроме случаев явной необходимости.

Модуль node:console предоставляет простую отладочную консоль, похожую на механизм console в браузерах.

Модуль экспортирует два основных элемента:

  • Класс Console с методами вроде console.log(), console.error() и console.warn() для записи в любой поток Node.js.
  • Глобальный объект console, настроенный на запись в process.stdout и process.stderr. Глобальный console можно использовать без require('node:console').

Предупреждение: методы глобального console не являются ни последовательно синхронными, как похожие API в браузере, ни последовательно асинхронными, как остальные потоки Node.js. Если поведение важно, сначала выясните, синхронный или асинхронный поток под капотом: это зависит от платформы и настройки стандартных потоков процесса. См. заметку о вводе-выводе процесса.

Пример с глобальным console:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
console.log('hello world');
// Выводит: hello world, в stdout
console.log('hello %s', 'world');
// Выводит: hello world, в stdout
console.error(new Error('Whoops, something bad happened'));
// Выводит сообщение об ошибке и стек в stderr:
//   Error: Whoops, something bad happened
//     at [eval]:5:15
//     at Script.runInThisContext (node:vm:132:18)
//     at Object.runInThisContext (node:vm:309:38)
//     at node:internal/process/execution:77:19
//     at [eval]-wrapper:6:22
//     at evalScript (node:internal/process/execution:76:60)
//     at node:internal/main/eval_string:23:3

const name = 'Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Выводит: Danger Will Robinson! Danger!, в stderr

Пример с классом Console:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);

myConsole.log('hello world');
// Выводит: hello world, в out
myConsole.log('hello %s', 'world');
// Выводит: hello world, в out
myConsole.error(
    new Error('Whoops, something bad happened')
);
// Выводит: [Error: Whoops, something bad happened], в err

const name = 'Will Robinson';
myConsole.warn(`Danger ${name}! Danger!`);
// Выводит: Danger Will Robinson! Danger!, в err

Класс: Console

Класс Console служит для создания простого логгера с настраиваемыми потоками вывода. Доступ: require('node:console').Console или console.Console (или деструктуризация):

1
import { Console } from 'node:console';
1
const { Console } = require('node:console');
1
const { Console } = console;

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

new Console(options)

  • options <Object>
    • stdout <stream.Writable>
    • stderr <stream.Writable>
    • ignoreErrors <boolean> Игнорировать ошибки записи в базовые потоки. По умолчанию: true.
    • colorMode <boolean> | <string> Поддержка цвета для этого экземпляра Console. true — раскраска при инспекции значений. false — без раскраски. 'auto' — зависит от isTTY и результата getColorDepth() для соответствующего потока. Нельзя использовать вместе с inspectOptions.colors. По умолчанию: 'auto'.
    • inspectOptions <Object> | <Map> Параметры для util.inspect(). Может быть объектом опций или, если для stdout и stderr нужны разные опции, Map от потоков к опциям.
    • groupIndentation <number> Отступ для групп. По умолчанию: 2.

Создаёт новый Console с одним или двумя потоками записи. stdout — для логов и информации. stderr — для предупреждений и ошибок. Если stderr не задан, для ошибок используется stdout.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import { createWriteStream } from 'node:fs';
import { Console } from 'node:console';
// Или
// const { Console } = console;

const output = createWriteStream('./stdout.log');
const errorOutput = createWriteStream('./stderr.log');
// Простой самодельный логгер
const logger = new Console({ stdout: output, stderr: errorOutput });
// как обычный console
const count = 5;
logger.log('count: %d', count);
// В stdout.log: count 5
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
const fs = require('node:fs');
const { Console } = require('node:console');
// Или
// const { Console } = console;

const output = fs.createWriteStream('./stdout.log');
const errorOutput = fs.createWriteStream('./stderr.log');
const logger = new Console({ stdout: output, stderr: errorOutput });
const count = 5;
logger.log('count: %d', count);
// В stdout.log: count 5

Глобальный console — особый Console, вывод идёт в process.stdout и process.stderr. Эквивалентно:

1
2
3
4
new Console({
    stdout: process.stdout,
    stderr: process.stderr,
});

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

  • value <any> Проверяемое значение на истинность.
  • ...message <any> Остальные аргументы — текст сообщения.

console.assert() выводит сообщение, если value ложно или не передано. Выполнение не прерывается. Вывод всегда начинается с "Assertion failed". Если передан message, он форматируется через util.format().

Если value истинно, ничего не происходит.

1
2
3
4
5
6
7
console.assert(true, 'does nothing');

console.assert(false, 'Whoops %s work', "didn't");
// Assertion failed: Whoops didn't work

console.assert();
// Assertion failed

console.clear()

Если stdout — TTY, console.clear() пытается очистить TTY. Если stdout не TTY, метод ничего не делает.

Поведение зависит от ОС и типа терминала. В большинстве Linux это похоже на команду clear. В Windows очищается только вывод в текущей области просмотра терминала для процесса node.

console.count([label])

  • label <string> Подпись счётчика. По умолчанию: 'default'.

Ведёт внутренний счётчик для label и выводит в stdout, сколько раз console.count() вызывали с этим label.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
> console.count()
default: 1
undefined
> console.count('default')
default: 2
undefined
> console.count('abc')
abc: 1
undefined
> console.count('xyz')
xyz: 1
undefined
> console.count('abc')
abc: 2
undefined
> console.count()
default: 3
undefined
>

console.countReset([label])

  • label <string> Подпись счётчика. По умолчанию: 'default'.

Сбрасывает внутренний счётчик для label.

1
2
3
4
5
6
7
8
9
> console.count('abc');
abc: 1
undefined
> console.countReset('abc');
undefined
> console.count('abc');
abc: 1
undefined
>

console.debug(data[, ...args])

console.debug() — псевдоним console.log().

console.dir(obj[, options])

  • obj <any>
  • options <Object>
    • showHidden <boolean> Если true, показываются ненумеруемые и символьные свойства. По умолчанию: false.
    • depth <number> Глубина рекурсии для util.inspect() при форматировании. Для бесконечной глубины передайте null. По умолчанию: 2.
    • colors <boolean> Если true, вывод с ANSI-цветами. Настройка цветов — см. настройку цветов util.inspect(). По умолчанию: false.

Вызывает util.inspect() для obj и пишет строку в stdout. Пользовательская функция inspect() на obj обходится.

console.dirxml(...data)

Вызывает console.log() с теми же аргументами. XML-форматирования не производится.

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

Пишет в stderr с переводом строки. Можно передать несколько аргументов: первый — основное сообщение, остальные — подстановки в стиле printf(3) (все аргументы передаются в util.format()).

1
2
3
4
5
const code = 5;
console.error('error #%d', code);
// Выводит: error #5, в stderr
console.error('error', code);
// Выводит: error 5, в stderr

Если в первой строке нет спецификаторов вроде %d, для каждого аргумента вызывается util.inspect(), строки склеиваются. Подробнее — util.format().

console.group([...label])

Увеличивает отступ последующих строк на groupIndentation пробелов.

Если переданы label, они печатаются первыми без дополнительного отступа.

console.groupCollapsed()

Псевдоним console.group().

console.groupEnd()

Уменьшает отступ последующих строк на groupIndentation пробелов.

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

console.info() — псевдоним console.log().

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

Пишет в stdout с переводом строки. Несколько аргументов: первый — сообщение, остальные — подстановки как в printf(3) (через util.format()).

1
2
3
4
5
const count = 5;
console.log('count: %d', count);
// Выводит: count: 5, в stdout
console.log('count:', count);
// Выводит: count: 5, в stdout

См. util.format().

console.table(tabularData[, properties])

  • tabularData <any>
  • properties <string[]> Альтернативный набор свойств для столбцов.

Пытается построить таблицу: столбцы из свойств tabularData (или из properties), строки — элементы tabularData, и вывести её. Если данные не удаётся разобрать как табличные, логируется аргумент как есть.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Не удаётся разобрать как табличные данные
console.table(Symbol());
// Symbol()

console.table(undefined);
// undefined

console.table([
    { a: 1, b: 'Y' },
    { a: 'Z', b: 2 },
]);
// ┌─────────┬─────┬─────┐
// │ (index) │ a   │ b   │
// ├─────────┼─────┼─────┤
// │ 0       │ 1   │ 'Y' │
// │ 1       │ 'Z' │ 2   │
// └─────────┴─────┴─────┘

console.table(
    [
        { a: 1, b: 'Y' },
        { a: 'Z', b: 2 },
    ],
    ['a']
);
// ┌─────────┬─────┐
// │ (index) │ a   │
// ├─────────┼─────┤
// │ 0       │ 1   │
// │ 1       │ 'Z' │
// └─────────┴─────┘

console.time([label])

  • label <string> По умолчанию: 'default'

Запускает таймер для измерения длительности операции. Таймеры различаются по label. Используйте тот же label в console.timeEnd(), чтобы остановить таймер и вывести прошедшее время в подходящих единицах в stdout. Например, при 3869 мс console.timeEnd() покажет "3.869s".

console.timeEnd([label])

  • label <string> По умолчанию: 'default'

Останавливает таймер, запущенный console.time(), и выводит результат в stdout:

1
2
3
4
console.time('bunch-of-stuff');
// Какая-то работа.
console.timeEnd('bunch-of-stuff');
// Выводит: bunch-of-stuff: 225.438ms

console.timeLog([label][, ...data])

  • label <string> По умолчанию: 'default'
  • ...data <any>

Для таймера, запущенного console.time(), выводит прошедшее время и остальные аргументы data в stdout:

1
2
3
4
5
6
console.time('process');
const value = expensiveProcess1(); // Returns 42
console.timeLog('process', value);
// Выводит "process: 365.227ms 42".
doExpensiveProcess2(value);
console.timeEnd('process');

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

Пишет в stderr строку 'Trace: ', затем сообщение, отформатированное util.format(), и стек до текущего места в коде.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
console.trace('Show me');
// Выводит: (стек зависит от места вызова)
//  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][, ...args])

console.warn() — псевдоним console.error().

Методы только для инспектора

Следующие методы предоставляет движок V8 в общем API, но ничего не выводят, если не используются вместе с инспектором (флаг --inspect).

console.profile([label])

Вне инспектора ничего не отображает. console.profile() начинает CPU-профиль JavaScript с необязательной меткой до вызова console.profileEnd(). Профиль затем попадает на панель Profile инспектора.

1
2
3
4
console.profile('MyLabel');
// Код
console.profileEnd('MyLabel');
// Добавляет профиль 'MyLabel' на панель Profiles инспектора.

console.profileEnd([label])

Вне инспектора ничего не отображает. Останавливает текущую сессию CPU-профилирования, если она была начата, и выводит отчёт на панель Profiles. Пример — см. console.profile().

Без метки останавливается последний запущенный профиль.

console.timeStamp([label])

Вне инспектора ничего не отображает. console.timeStamp() добавляет событие с меткой на панель Timeline инспектора.

Комментарии