繁体   English   中英

错误:ENOENT 带有 Bunyan 旋转文件日志记录 (NodeJS)

[英]Error: ENOENT with Bunyan rotating-file logging (NodeJS)

我正在使用 Bunyan 模块进行 NodeJS 日志记录。 当我尝试使用旋转文件类型时,它每次都会使我的应用程序崩溃并输出此错误:

错误:ENOENT,重命名“logs/info.log.3”

但是,它永远不会同时发生,所以我找不到任何逻辑......这就是我实例化我的记录器的方式:

var log = Bunyan.createLogger(config.log.config);
log.info('App started, ' + process.env.NODE_ENV);

这是我的 config.json:

  {
    "name"    : "app",
    "streams" : [
        {
            "type"  : "rotating-file",
            "period": "5000ms",        //Low period is for testing purposes
            "count" : 12,
            "level" : "info",
            "path"  : "logs/info.log"
        },
        {
            "type"  : "rotating-file",
            "period": "5000ms",
            "count" : 12,
            "level" : "error",
            "path"  : "logs/error.log"
        },
        {
            "type"  : "rotating-file",
            "period": "5000ms",
            "count" : 12,
            "level" : "trace",
            "path"  : "logs/trace.log"
        }
    ]
  }

谁能建议如何解决我的问题? 提前致谢。

我刚刚(实际上是昨晚)为了解决主 + 工作人员争夺班扬旋转文件的问题而做的事情是让工作人员将“原始”日志记录写入我创建的称为 WorkerStream 的类流对象。 WorkerStream 的 write 方法简单地调用 process.send 使用 IPC 将日志记录传递给 master。 master 使用指向旋转文件的不同记录器配置。 master 使用下面显示的代码来监听来自其 worker 的日志记录并将它们写入日志文件。 到目前为止,它似乎运行良好。

cluster.on('online', function (worker) {
  // New worker has come online.
  worker.on('message', function (msg) {
    /* Watch for log records from this worker and write them 
       to the real rotating log file.
    */
    if (msg.level) {
      log._emit(msg);
    }
  });
});

ln是你的朋友。

现有的日志库有集群模块的轮换问题。 为什么ln没有这个问题?

  • bunyan 和 log4js 都在轮换时重命名日志文件。 由于双文件重命名,灾难发生在集群环境下的文件重命名。 bunyan 建议使用进程 ID 作为文件名的一部分来解决这个问题。 但是,这会生成过多的文件。
  • log4js 提供了一个多进程 appender,让 master 记录一切。 但是,这肯定有瓶颈问题。
  • 为了解决这个问题,我只使用fs.createWriteStream(name, {"flags": "a"})在开头创建一个格式化的日志文件,而不是在末尾创建fs.rename 我在集群环境下用毫秒轮换测试了这个方法,没有发生灾难。

我在不使用聚类的情况下遇到了同样的问题。 我相信问题是由位于日志目录中的旧文件引起的。 虽然主记录器可以打开并附加到现有文件,但文件轮换逻辑使用重命名,当它踩到现有文件时。 (例如现有的 info.log.3 文件)。

我仍在挖掘源代码以找出需要更改哪些内容才能从滚动错误中恢复。

当我查看源代码时,还有一个想法。 如果您有多个使用相同日志文件的 Bunyan 日志实例(在我的例子中,是一个常见的 error.log),重命名调用可能会从操作系统级别几乎同时发生(从 Node.js 的角度来看异步和单独的调用,但是同时从操作系统的角度来看)。

遗憾的是,不可能对同一个文件使用多个旋转文件流。

如果您在同一个进程中,则必须使用单个记录器对象 - 确保您没有创建多个记录器对象。

如果您正在跨进程工作,则必须登录到不同的文件。 不幸的是,目前还没有 IPC 允许不同的旋转器在它们之间进行协调。

我有一个插件旋转文件流,可以检测您是否尝试在单个进程中针对同一个文件创建 2 个旋转器并引发错误。 在多个进程的情况下它无济于事。

bunyan-旋转文件流

根据我的经验,有时会在logs目录(或您命名的任何目录)不存在时发生。

例如,如果您在自动化管道中遇到此错误,您可能会忽略logs所有文件并将其提交为空,那么在管道克隆存储库时不会创建它。

只需确保通过在其中放置.gitkeep文件(或任何其他技巧)来创建logs

你们中的许多人可能遇到过这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM