javascript - Node.js - eventListener - 如何在触发事件时登录文件
问题描述
我在node.js 文档中看到“监听器函数只能执行同步操作”。但是,当我尝试使用 fs.writeFileSync 时,它不起作用:
net.createServer(function (socket)
{
[...]
socket.on('error', (err) => {
**fs.writeFileSync('C:\temp\test.txt', err.message);**
console.log('Connection error:', err.message);
});
}).listen(port);
也许我不明白什么?
console.log 只允许我的脚本在套接字突然关闭时不会崩溃,例如,由于负载均衡器发送的 RST。在生产中,当我从侦听端口(使用 TCP)收到错误时,我需要在文件中进行跟踪。但是,如果我添加 fs.writeFileSync 行,我的脚本会不断崩溃,并且我的文件中没有任何日志。有没有办法做到这一点?
解决方案
文档中的此引用仅适用于它描述的事件 - process.on('exit')
:
侦听器函数只能执行同步操作。Node.js 进程将在调用 'exit' 事件侦听器后立即退出,从而导致任何仍在事件循环中排队的额外工作被放弃。
这不是一般性的陈述——你可以很好地在事件监听器中触发异步操作(但请注意,EventEmitter 不会等待你的异步工作完成——所以要小心并发问题)。对于日志记录,请考虑只打开一次文件并附加以避免额外的开销。
通常,日志库可以为您解决这个问题。例如,winston可以直接写入文件。一种流行的替代方法是使用更轻量级的库(例如pino )将所有内容记录到标准输出,然后在进程管理器(例如 PM2 或 docker)下运行 Node.js,这些管理器已经捕获标准输出并将其自动写入文件。
推荐阅读
- architecture - 你能在 gem5 上模拟勒索软件吗?
- docker - 在 WSL2 VM 中检测 Docker for Windows 与 Docker Native
- asp.net-identity - 如何使用表单身份验证(成员身份)将多个 ASP.NET Web 表单应用程序转换为指向新的 .NET Core Identity 站点以供其登录
- javascript - 单击功能显示/隐藏内容时出现错误
- java - Orika:自定义 MappingFacade
- mysql - 将值添加到添加的列中
- c - 一次将3位写入C中的二进制文件
- python - Python 和 MySQL 连接器 - 连接超时错误
- html - 更改父菜单颜色,当我们使用 CSS 和 html 点击 childMenu
- python - 试图替换列表中的项目,但它似乎不起作用