Node.js管道控制台错误到另一个程序(使其异步)
来自Expressjs: 要保持应用程序完全异步,您仍然需要管道 将console.err()复制到另一个程序 问题:Node.js管道控制台错误到另一个程序(使其异步),node.js,asynchronous,logging,Node.js,Asynchronous,Logging,来自Expressjs: 要保持应用程序完全异步,您仍然需要管道 将console.err()复制到另一个程序 问题: 运行带有stdout和stderr重定向到而不阻止事件循环的节点应用程序是否足够?像这样:节点应用程序2>&1 | tee日志文件 如果ad.1的答案是正确的,那么如何在使用Winston或Bunyan时实现无阻塞日志记录?他们有一些内置机制来实现这一点,或者他们只是将数据保存到特定文件浪费当前Node.js进程的cpu时间?或者,为了实现真正的异步日志记录,他们应该将数据管道
节点应用程序2>&1 | tee日志文件
- 文件:在Windows和POSIX上同步
- TTYs(终端):在Windows上异步,在POSIX上同步
- 管道(和套接字):在Windows上同步,在POSIX上异步
- Stdout和stderr通过管道连接到进程
tee
写入终端和文件日志文件tee
- Winston有传输的概念,它本质上允许您配置日志的去向。如果需要异步日志,则应使用除。使用文件传输应该是可以的,因为它应该为这个和那个创建一个异步的文件流对象,并且不会阻塞节点进程
- 班扬有一个类似的配置选项:。根据他们的文档,它可以接受任何流接口。只要您避免在这里使用process.stdout和process.stderr流,就应该可以了
console.log()
等)、写入文件(fs.writeFile()
、fs.writeFileSync()
等)或将数据发送到流process.stdout.write(data)
等)将始终“阻止事件循环”。为什么?因为这些函数的某些部分总是用JavaScript编写的。这些函数所需的最小工作量是接收输入并将其交给一些本机代码,但总会执行一些JS
由于涉及JS,它将不可避免地“阻塞”事件循环,因为JavaScript代码总是在单个线程上执行,无论发生什么情况
这是件坏事吗。。。?
不需要。处理一些日志数据并将其发送到文件或流所需的时间非常少,对性能没有显著影响
什么时候这会是件坏事,那么。。。?
您可以通过执行通常称为“同步”I/O操作的操作来损害您的应用程序,也就是说,写入文件并且在写入完成之前实际上不执行任何其他JavaScript代码。当您这样做时,您会将所有数据交给底层本机代码,并且在理论上能够继续在JS空间中执行其他工作的同时,您会故意决定等待本机代码返回结果这将“阻止”事件循环,因为这些I/O操作可能比执行常规代码花费更长的时间(磁盘/网络往往是计算机中最慢的部分)
现在,让我们回到编写stdout
/stderr
。
从Node.js的文档:
process.stdout和process.stderr与其他Node.js流的重要区别在于:
- 文件:在Windows和POSIX上同步
- TTYs(终端):在Windows上异步,在POSIX上同步
- 管道(和插座)