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

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

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

Error: ENOENT, rename '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"
        }
    ]
  }

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

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

我仍在深入研究源代码以找出需要更改的内容才能从滚动错误中恢复。

我在查看源代码时还有一个想法。如果您有多个使用相同日志文件的 Bunyan 日志实例(在我的例子中,一个常见的 error.log),重命名调用可能几乎同时发生在 OS 级别(来自Node.js视角,但同时从OS视角)。

为了解决 master + worker 争夺 Bunyan 旋转文件的问题,我刚刚(实际上是昨晚)所做的是让 worker 将 "raw" 日志记录写入类似流的文件中我创建的对象称为 WorkerStream。 WorkerStream 的 write 方法只是调用 process.send 使用 IPC 将日志记录传递给 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);
    }
  });
});

遗憾的是无法对同一个文件使用多个旋转文件流。

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

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

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

bunyan-rotating-file-stream

ln是你的朋友。

现有的日志记录库在集群模块中存在旋转问题。为什么ln没有这个问题?

  • Both bunyan and log4js rename the log file on rotation. The disaster happens on file renaming under cluster environment because of double files renaming. bunyan suggests using the process id as a part of the filename to tackle this issue. However, this will generate too many files.
  • log4js provides a multiprocess appender and lets master log everything. However, this must have the bottleneck issue.
  • To solve this, I just use fs.createWriteStream(name, {"flags": "a"}) to create a formatted log file at the beginning instead of fs.rename at the end. I tested this approach with millisecond rotation under cluster environment and no disasters occurred.

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

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

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

很多遇到这个问题的人可能都是这种情况。