4

我正在使用 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"
        }
    ]
  }

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

4

5 回答 5

1

我刚刚做的(实际上是昨晚)解决master + workers 争夺Bunyan 旋转文件的问题是让worker 将“原始”日志记录写入我创建的类似流的对象,称为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);
    }
  });
});
于 2015-12-16T18:37:55.713 回答
1

ln是你的朋友。

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

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

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

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

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

于 2015-05-05T01:20:49.097 回答
0

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

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

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

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

bunyan-旋转文件流

于 2016-02-21T22:54:41.563 回答
0

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

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

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

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

于 2021-01-25T22:32:49.283 回答