node.js - NodeJS winston 记录大量写入陷入困境

标签 node.js winston

Node JS - 12.7 winston - 1.0.1

我正在努力尝试生成代表许多“设备”的“假”日志文件。基本上我将使用这些数据在 Kibana 中进行测试和可视化。

我将我的 Winston 设置为记录到文件,如下所示:

var winston = require('winston');

var logger = new (winston.Logger)({
transports: [
    new (winston.transports.File)({
        filename: 'logs/dsm.log'
    })
  ]
});

所以我有一个设备数组,它只是一个 12 字节哈希列表,例如:AB4576D4C6AC 等。

我正在循环设备数组并组装我的“假”日志条目,如下所示:

for (var i = 0; i < devices.length; i++) {
    var timeStmp = startDateTime.clone().add((i * config.dsmIntervalMinutes), "m");
    dsm = {
        deviceId: devices[i].deviceId,
        msg: "some log entry text",
        timeStmp: timeStmp
    };
    logger.info(dsm);
}

如您所见,在循环中创建每个 DSM 后,我将消息作为 info 记录到 Winston。

所以这似乎工作正常,除非我有大量设备。我想要最多 100 万台设备。我目前正在努力完成 100k。

我看到的是 Node 进程没有将日志写入日志文件。它似乎将它们全部存储在内存中(如使用 top 所示),一旦达到 10k 左右,它就会减慢速度并最终停止进度。日志文件永远不会被写入。

所以我想知道是否有办法做到这一点?我可以以某种方式强制 Node/winston 每隔一段时间停止并写入磁盘吗?比如刷新缓存?我在 winston 没有看到这方面的选项。

任何帮助将不胜感激!

最佳答案

这是因为您正在使用 for 循环。 Node.js(JavaScript 层)是单线程的。您的 for 循环正在阻止进程实际进入写入阶段。

将其更改为类似这样的内容,以便您在设备上循环而不会阻碍进程:

function doLog (d, cb) {
    var timeStmp = startDateTime.clone().add((i * config.dsmIntervalMinutes), "m");
    dsm = {
        deviceId: d.deviceId,
        msg: "some log entry text",
        timeStmp: timeStmp
    };
    // Callback is fired once the write is complete
    logger.info(dsm, cb);
}

async.eachSeries(devices, doLog, function () {
  log.info('Finished!')
});

异步模块基本上将按顺序运行每个操作(eachSeries),并在内部使用 setImmediate 推迟每个调用,以在开始下一个设备 doLog 调用之前允许 I/O。您还可以研究 async.parallelLimit 同时执行一些操作以获得更好的性能。

关于node.js - NodeJS winston 记录大量写入陷入困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31539636/

相关文章:

node.js - Node.js 的进程间和服务器间事件发射器/监听器?

javascript - 替换 JSON 中数组中的键和字符串

node.js - 如果我不上传文件,如何从 npm 的 multer 获取请求正文?

mysql - 仅检索单个记录的 Node.js MySQL 代码有什么问题

javascript - express - winston : Write Express Access Logs to File

javascript - 将当前 session 存储在变量中以在 MySQL 查询中使用

node.js - winston 自定义传输格式消息

node.js - 需要 Morgan & Winston 使用 btyesize 记录 api 响应

electron - 从打包的asar应用程序 Electron 访问extraFiles Electron 生成器

node.js - 如何在Node.js中通过winston-loggly向Loggly发送主机和应用程序信息