当在nodejs中使用集群和winston时,日志的最大大小不起作用

当我在nodejs中使用集群和winston时,日志的最大大小不起作用。所有的日志都会logging一个文件,虽然大小超过了最大大小。 在这里看到同样的问题: https : //github.com/flatiron/winston/issues/275

显而易见的解决scheme是:只让主日志到文件。

var winston = require('winston'); var cluster = require('cluster'); if(cluster.isMaster) { cluster.setupMaster({ silent: true }); // Keep cluster from automatically grabbing stdin/out/err for(var i = 0; i < 4; i++) { cluster.fork(); } winston.add(winston.transport.File, { filename: 'log.txt' }); cluster.workers.forEach(function(worker, i) { worker.process.stdout.on('data', function(chunk) { winston.info('worker ' + i + ': ' + chunk); }); worker.process.stderr.on('data', function(chunk) { winston.warn('worker ' + i + ': ' + chunk); }); }); } else { // Leave winston alone and only log to stdout/err in the workers } 

然后只有一个进程在文件描述符上保留,所以你的日志轮换应该照常运行。

也许你应该使用DailyFileRotation来代替。 截至今天,我没有看到任何问题。 我使用winston每一个在主进程和分叉进程,他们共享相同的文件。

这是我从testing中发现的。 你可以看到所有的日志均匀分布在旋转前后。 您也可以清楚地看到日志中的截止date。 在交换机之后,旧的日志也停止增长。

 joephone@Fengs-MacBook-Pro-2:logs$ ls total 3184 -rw-r--r-- 1 joephone staff 985111 Aug 24 20:01 info.log.2016-08-25-03-00 -rw-r--r-- 1 joephone staff 641506 Aug 24 20:01 info.log.2016-08-25-03-01 joephone@Fengs-MacBook-Pro-2:logs$ cut -f8 -d"\"" info.log.2016-08-25-03-00 | sort | uniq -c 3299 65151 3355 65152 3307 65153 3345 65154 1 cpucount:4 1 worker 65151 starts working. 1 worker 65152 starts working. 1 worker 65153 starts working. 1 worker 65154 starts working. joephone@Fengs-MacBook-Pro-2:logs$ cut -f8 -d"\"" info.log.2016-08-25-03-01 | sort | uniq -c 2193 65151 2207 65152 2122 65153 2147 65154 joephone@Fengs-MacBook-Pro-2:logs$ tail -3 info.log.2016-08-25-03-00 {"level":"info","message":"65154","timestamp":"2016-08-25T03:00:59.997Z"} {"level":"info","message":"65153","timestamp":"2016-08-25T03:00:59.997Z"} {"level":"info","message":"65152","timestamp":"2016-08-25T03:00:59.997Z"} joephone@Fengs-MacBook-Pro-2:logs$ head -3 info.log.2016-08-25-03-01 {"level":"info","message":"65151","timestamp":"2016-08-25T03:01:00.000Z"} {"level":"info","message":"65151","timestamp":"2016-08-25T03:01:00.012Z"} {"level":"info","message":"65152","timestamp":"2016-08-25T03:01:00.006Z"} 

为了我的好奇心,我也通过把所有代码放到每个分叉进程中进行testing。 我仍然没有看到任何问题。

 joephone@Fengs-MacBook-Pro-2:logs$ ls total 3216 -rw-r--r-- 1 joephone staff 993838 Aug 24 20:14 info.log.2016-08-25-03-13 -rw-r--r-- 1 joephone staff 650312 Aug 24 20:14 info.log.2016-08-25-03-14 joephone@Fengs-MacBook-Pro-2:logs$ cut -f8 -d"\"" info.log.2016-08-25-03-13 | sort | uniq -c 3402 65755 3342 65756 3344 65757 3337 65758 1 worker 65755 starts working. 1 worker 65756 starts working. 1 worker 65757 starts working. 1 worker 65758 starts working. joephone@Fengs-MacBook-Pro-2:logs$ cut -f8 -d"\"" info.log.2016-08-25-03-14 | sort | uniq -c 2183 65755 2202 65756 2230 65757 2173 65758 joephone@Fengs-MacBook-Pro-2:logs$ tail -3 info.log.2016-08-25-03-13 {"level":"info","message":"65757","timestamp":"2016-08-25T03:13:59.986Z"} {"level":"info","message":"65755","timestamp":"2016-08-25T03:13:59.986Z"} {"level":"info","message":"65756","timestamp":"2016-08-25T03:13:59.994Z"} joephone@Fengs-MacBook-Pro-2:logs$ head -3 info.log.2016-08-25-03-14 {"level":"info","message":"65758","timestamp":"2016-08-25T03:14:00.005Z"} {"level":"info","message":"65757","timestamp":"2016-08-25T03:14:00.005Z"} {"level":"info","message":"65758","timestamp":"2016-08-25T03:14:00.024Z"} 

对于好奇心的好奇心,我甚至用错误的方式对它进行了testing,导致了一个分叉过程,并且主人带来了一个新的问题。 日志仍然有效。

其实这两种方式可能没有什么不同,如果你使用ps来grep你正在运行的脚本,你会看到主进程和分叉进程。 他们就像你在多个terminal上运行我想的那样。