前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Node.js 环境下的 console.log 是同步执行的

Node.js 环境下的 console.log 是同步执行的

作者头像
Jerry Wang
发布2021-12-14 13:56:19
1.3K0
发布2021-12-14 13:56:19
举报

参考这个官网

通常,从您的应用程序进行日志记录有两个原因:用于调试和记录应用程序活动(本质上是其他所有内容)。使用 console.log() 或 console.error() 将日志消息打印到终端是开发中的常见做法。 但是当目标是终端或文件时,这些函数是同步的,因此它们不适合生产,除非您将输出通过管道传输到另一个程序。

https://nodejs.org/api/console.html#console_console_1

控制台模块提供了一个简单的调试控制台,类似于 Web 浏览器提供的 JavaScript 控制台机制。

该模块导出两个特定组件:

一个 Console 类,带有可用于写入任何 Node.js 流的 console.log()、console.error() 和 console.warn() 等方法。 配置为写入 process.stdout 和 process.stderr 的全局控制台实例。无需调用 require(‘console’) 即可使用全局控制台。 警告:全局控制台对象的方法既不像它们相似的浏览器 API 那样始终同步,也不像所有其他 Node.js 流那样始终异步。有关更多信息,请参阅有关进程 I/O 的说明。

使用全局控制台的示例:

代码语言:javascript
复制
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 message and stack trace to 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!`);
// Prints: Danger Will Robinson! Danger!, to stderr

使用 Console class 的例子:

代码语言:javascript
复制
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

process.stdout 和 process.stderr 在下列方面与其他 Node.js 流不同:

  • 它们分别由 console.log() 和 console.error() 在内部使用。
  • 写入可能是同步的,具体取决于流所连接的内容以及系统是 Windows 还是 POSIX:
  • 文件:在 Windows 和 POSIX 上同步
  • TTY(终端):在 Windows 上异步,在 POSIX 上同步
  • 管道(和套接字):在 Windows 上同步,在 POSIX 上异步

这些行为部分是出于历史原因,因为更改它们会导致向后不兼容,但某些用户也期望它们。

同步写入避免了诸如使用 console.log() 或 console.error() 写入的输出意外交错的问题,或者如果在异步写入完成之前调用 process.exit() 则根本不写入。有关更多信息,请参阅 process.exit()。

警告:同步写入会阻塞事件循环,直到写入完成。在输出到文件的情况下,这几乎是瞬时的,但在高系统负载下,接收端没有读取管道,或者终端或文件系统缓慢,事件循环可能经常被阻塞并且时间长到足以对性能产生严重的负面影响。这在写入交互式终端会话时可能不是问题,但在对流程输出流进行生产日志记录时要特别小心。

要检查流是否连接到 TTY 上下文,请检查 isTTY 属性。

例如:

代码语言:javascript
复制
$ node -p "Boolean(process.stdin.isTTY)"
true
$ echo "foo" | node -p "Boolean(process.stdin.isTTY)"
false
$ node -p "Boolean(process.stdout.isTTY)"
true
$ node -p "Boolean(process.stdout.isTTY)" | cat
false

https://nodejs.org/api/process.html#processstdout

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-10-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档