5

我已经尝试过实例化和关闭 winston 记录器,如https://github.com/flatiron/winston#instantiating-your-own-logger上描述的(一半) ,但无济于事。我在关闭 Winston 的文件传输时遇到了麻烦 - 浏览它的源代码,我发现关闭记录器的正确方法似乎是close方法。我希望这能够关闭记录器使用的传输文件——但事实并非如此。

根据 node.js 服务器负载的频率变化,winston 仍会保留许多传输文件,在close为它们调用方法后无限长的时间,在没有新的写入启动后无限长的时间。我通过 node.js 进程文件描述符表 ( lsof -p) 观察到这一点。即使close调用了 Winston 记录器,它也会无限期地保持日志文件的文件描述符“正在使用”,即日志文件永远不会真正关闭。因此,在我的应用程序运行很长时间后,文件描述符泄漏并最终使 node.js 进程遇到了 ulimit (-n) 限制。

是否应该有一个特定的编程模式来排空 Winston 记录器,以便最终关闭它?

4

3 回答 3

1

仅创建一个记录器实例,然后从中派生子代。在这种情况下,winston 将只保存一个打开文件处理程序。也可能对性能更好。

于 2021-01-14T01:44:47.047 回答
0

这只是一个建议,我自己没有尝试过 - 但我看到你没有得到任何其他答案 - 那么有什么害处......

它在这里说: https ://github.com/flatiron/winston#file-transport

您可以提供写入流而不是文件路径。那么,您为什么不自己管理文件以及何时关闭 - 关闭记录器,然后关闭文件句柄?

于 2014-09-01T19:37:32.893 回答
0

这是一个老问题,但根据文档,它会是这样的:

logger.on('finish', function (info) {
  // All `info` log messages has now been logged
  // Do here whatever you like to do after last log message has been written.
});

logger.info('The last message');
logger.end();

也许还添加

logger = null;

在脚本的结尾

于 2021-12-16T22:05:07.760 回答