错误:ENHANENT与Bunyan旋转文件logging(NodeJS)

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

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

然而,它从来没有发生在同一时间,所以我无法find任何逻辑…这是我如何instanciate我的logging器:

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" } ] } 

任何人都可以build议如何解决我的问题? 提前致谢。

我遇到同样的问题,而不使用集群。 我相信问题是由于坐在日志目录中的旧文件造成的。 虽然主logging器可以打开并附加到现有文件,但是文件循环逻辑使用重命名,即在现有文件上执行时使用哪些文件。 (例如现有的info.log.3文件)。

我还在挖掘源头,找出需要改变什么以从滚动错误中恢复。

我回顾一下另一个想法。 如果你有多个使用相同日志文件的Bunyan日志实例(在我的例子中是一个常见的error.log),那么重命名调用可能几乎同时发生在操作系统级别(从Node.js透视图的asynchronous和单独调用,但是同时从操作系统的angular度来看)。

我刚才所做的(实际上是昨天晚上)为了解决这个问题,主人+工人争夺一个Bunyan旋转文件,就是让工作人员将“原始”日志logging写入到我创build的一个名为WorkerStream的stream式对象中。 WorkerStream的写入方法只需调用process.send来使用IPC将日志logging传递给主机。 主人使用不同的logging器configuration,指向一个旋转文件。 主服务器使用下面显示的代码来监听来自其工作人员的日志logging并将其写入日志文件。 到目前为止,它似乎是完美的。

 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); } }); }); 

@ victorkohl,我遇到同样的问题。 正如你所提到的,我们也使用了node.js集群。

Bunyan + Node.js群集旋转日志文件。 应用程序崩溃和服务器重新启动。

对于同一个文件,使用多个旋转文件stream是不幸的。

如果你在同一个过程中,你必须使用一个logging器对象 – 确保你没有创build它们的多个。

如果您正在跨进程工作,则必须login到不同的文件。 不幸的是,现在还没有任何IPC允许不同的轮转机构进行相互协调。

我有一个插件旋转文件stream,检测您是否尝试创build2旋转对单个进程中的同一个文件,并引发错误。 它不能帮助多个进程tho。

本仁旋转文件stream

是你的朋友。

现有的日志logging库与群集模块有旋转问题。 为什么没有这个问题?

  • bunyan和log4js都重命名轮转的日志文件。 由于双重文件重命名,群集环境下的文件重命名发生灾难。 bunyanbuild议使用进程ID作为文件名的一部分来解决这个问题。 但是,这会产生太多的文件。
  • log4js提供了一个多进程appender,让主人login一切。 但是,这必须有瓶颈问题。
  • 为了解决这个问题,我只是使用fs.createWriteStream(name, {"flags": "a"})来创build一个格式化的日志文件,而不是最后的fs.rename 。 我在集群环境下以毫秒为单位testing了这种方法,没有发生灾难。