【问题标题】:node.js Winston - how to safely drain a loggernode.js Winston - 如何安全地耗尽记录器
【发布时间】:2014-09-15 08:40:07
【问题描述】:

我已经尝试过实例化和关闭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 记录器,以便最终将其关闭?

【问题讨论】:

    标签: node.js winston


    【解决方案1】:

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

    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;
    

    在脚本的结尾

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2015-04-15
          • 2015-03-10
          • 2020-12-27
          • 2021-07-27
          • 2023-03-29
          • 2019-05-20
          • 2021-09-08
          • 1970-01-01
          • 2021-08-13
          相关资源
          最近更新 更多