我正在使用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"
}
]
}
有人可以建议如何解决我的问题吗?提前谢谢。
答案 0 :(得分:1)
我刚才所做的(昨晚实际上)解决了一个主人+工人争夺Bunyan旋转文件的问题,就是让工人将“原始”日志记录写入我创建的类似流的对象一个WorkerStream。 WorkerStream的write方法只是调用process.send来使用IPC将日志记录传递给master。主服务器使用指向旋转文件的不同记录器配置。主服务器使用下面显示的代码来监听其工作人员的日志记录,并将其写入日志文件。到目前为止它似乎工作得很好。
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);
}
});
});
答案 1 :(得分:1)
ln是你的朋友。
- bunyan和log4js在轮换时重命名日志文件。由于双重文件重命名,灾难发生在群集环境下的文件重命名上。 bunyan建议使用进程ID作为文件名的一部分来解决此问题。但是,这会生成太多文件。
- log4js提供了一个多进程appender,让master记录所有内容。但是,这必然会出现瓶颈问题。
- 要解决此问题,我只需使用
fs.createWriteStream(name, {"flags": "a"})
在开头创建格式化的日志文件,而不是最后创建fs.rename
。我在集群环境下以毫秒旋转测试了这种方法,没有发生任何灾难。
答案 2 :(得分:0)
我在没有使用群集的情况下遇到了同样的问题。我认为问题是由位于日志目录中的旧文件引起的。虽然主记录器可以打开并附加到现有文件,但文件轮换逻辑使用重命名,该文件在处理现有文件时使用。 (例如现有的info.log.3文件)。
我仍在挖掘资源,找出需要改变的内容,以便从滚动错误中恢复。
另外一个想法是我查看来源。如果您有多个Bunyan日志实例使用相同的日志文件(在我的情况下,是一个常见的error.log),重命名调用几乎可以同时从OS级别发生(从Node.js角度进行异步和单独调用,但是同时从操作系统的角度来看)。
答案 3 :(得分:0)
遗憾的是,对同一个文件使用多个旋转文件流是不可能的。
如果你在同一个过程中,你必须使用一个记录器对象 - 确保你没有创建多个记录器对象。
如果您正在跨进程工作,则必须登录到不同的文件。不幸的是,目前还没有IPC允许不同的旋转器相互协调。
我有一个插件旋转文件流,可以检测您是否尝试在单个进程中针对同一文件创建2个旋转器并抛出错误。 在多个流程的情况下,它无法提供帮助。
答案 4 :(得分:0)
根据我的经验,有时会在 logs
目录(或任何您命名的目录)不存在时发生。
如果您在自动化管道中遇到此错误,例如,您可能忽略 logs
中的所有文件并将其提交为空,那么在管道克隆存储库时不会创建它。
只需确保通过在其中放置一个 logs
文件(或任何其他技巧)来创建 .gitkeep
。
遇到这个问题的许多人可能都是这种情况。