除第一天外,如何使用Winston每日轮换日志

时间:2016-08-09 14:10:48

标签: node.js logging winston

我需要每天轮换日志,但当天的文件除外。 我使用 winston winston-daily-rotate-file 库。

在以下示例中,文件" info.log.2016-08-09"在我第一次执行节点时生成。

但是,我真的需要生成文件" info.log",并且在这一天之后,应该重命名为" info.log.2016-08-09",并且创建一个新的" info.log"对于当天。 我明白这是其他应用程序中的正常行为。



var logger = new (winston.Logger)({
  transports: [
    new dailyRotateFile(  
      {
        name: 'cronInfo',
        filename:  path.join(__dirname,"log", "info.log"),
      level: 'info',
       timestamp: function(){                
        return utils.formatDate(new Date(), "yyyy-mm-dd'T'HH:MM:ss.l'Z'")
      },
      formatter: function(options) {
          return  options.timestamp() +' ['+ options.level.toUpperCase() +'] '+ (undefined !== options.message ? options.message : '') +
               (options.meta && Object.keys(options.meta).length ? '\n\t'+ JSON.stringify(options.meta) : '' );          
      },
      json:false,
      datePattern:".yyyy-MM-dd"
    })
   ]
});
 




3 个答案:

答案 0 :(得分:2)

一个解决方法是将另外一个传输到info.log

就像这样:

var logger = new (winston.Logger)({
  transports: [
    new dailyRotateFile(  
      {
        //your definition of rotate file
      }),
    new (winston.transports.File)({ filename: 'info.log' })
   ]
});

然后设置一些cron在午夜删除info.log,即node-schedule

然而,使用这种方法几乎没有不一致性,如果某些事情在午夜运行,它可以将几行记录到属于第二天的info.log中,然后将其删除,因此info.log可以不完整。< / p>

但是所有具有此info.log.2016-08-09格式的日志都会保持完整且不受影响。

因此,考虑是否有一天获得不完整的info.log的可能性非常小。 (但你可以创建更高级的检查器,不仅删除文件,但查看是否存在新的一天的文件,如果是这样,它看起来里面是什么,然后从info.log只删除前几天的日志,它不会删除它所有的一次)

答案 1 :(得分:0)

另一种没有数据边界问题的方法只是使用:

var logger = new (winston.Logger)({
  transports: [
    new dailyRotateFile(  
      {
        // your definition of rotate file
      })
   ]
});

然后为info.log创建一个链接到当前文件的符号链接。最后,您可以使用:

transport.on('rotate', function(oldFilename, newFilename) {
    fs.symlinkSync(newFilename, 'info.log');
});

在旋转时更新符号链接。

如果您的日志文件特别大,这还将节省一些磁盘空间。

答案 2 :(得分:0)

对于那些仍在寻找正确方法的人,此功能已在v.4.1.0中添加。

只需使用createSymlinksymlinkName选项:

new DailyRotateFile({
    ...
    createSymlink: true,
    symlinkName: 'info.log',
});