首页 > 解决方案 > 为什么在记录器上调用 .close() 时 winston-syslog 重新打开连接

问题描述

我有一个简单的笑话测试代码,它使用以下传输配置创建一个新的 winston 记录器的实例:

it("using TCP protocol", async (done) => {
       const sys: any = new ws.Syslog({
                    host: "localhost",
                    port: 514,
                    protocol: "tcp4",
                    path: "/dev/log",
                    app_name: "ESB",
                    facility: "local5",
                    eol: "\n",
                });
                let syslogger = winston.createLogger({
                    levels: winston.config.syslog.levels,
                    transports: [
                      sys
                    ]
                  });

                syslogger.info("test msg");
                syslogger.close();
});

测试运行良好,我可以看到 syslog 正在接收消息,但测试似乎没有返回并在显示测试结果后挂起。在调试(winston-syslog.js)时,我看到它正在尝试再次连接。事件处理程序似乎没有退出。这是有意的还是可能是一个错误?

.on('close', () => {
        //
        // Attempt to reconnect on lost connection(s), progressively
        // increasing the amount of time between each try.
        //
        const interval = Math.pow(2, this.retries);
        this.connected = false;

        setTimeout(() => {
          this.retries++;
          **this.socket.connect(this.port, this.host);**
        }, interval * 1000);
      })

我了解存在尝试重新连接丢失连接的线路。但是,假设连接已成功创建、消息已发送并且我不再需要连接,我该如何实际关闭连接?如果该行被注释,jest 按预期返回。

该代码在 Centos 7 上运行,节点为 v 12.13.0,并且:

"winston": "^3.2.1",
"winston-syslog": "^2.4.0",
"winston-transport": "^4.3.0"

我是否缺少任何配置或清理调用?有没有办法让 close() 事件处理程序退出?

谢谢!

标签: node.jsjestjssyslogwinston

解决方案


推荐阅读