首页 > 解决方案 > 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 行,我的脚本会不断崩溃,并且我的文件中没有任何日志。有没有办法做到这一点?

标签: javascriptnode.jstcpevent-listener

解决方案


文档中的此引用仅适用于它描述的事件 - process.on('exit')

侦听器函数只能执行同步操作。Node.js 进程将在调用 'exit' 事件侦听器后立即退出,从而导致任何仍在事件循环中排队的额外工作被放弃。

这不是一般性的陈述——你可以很好地在事件监听器中触发异步操作(但请注意,EventEmitter 不会等待你的异步工作完成——所以要小心并发问题)。对于日志记录,请考虑只打开一次文件并附加以避免额外的开销。

通常,日志库可以为您解决这个问题。例如,winston可以直接写入文件。一种流行的替代方法是使用更轻量级的库(例如pino )将所有内容记录到标准输出,然后在进程管理器(例如 PM2 或 docker)下运行 Node.js,这些管理器已经捕获标准输出并将其自动写入文件。


推荐阅读