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

问题描述 投票:0回答:4

除了当天的文件外,我需要每天轮换日志。 我正在使用 winstonwinston-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"
    })
   ]
});
 

node.js logging winston
4个回答
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可能不完整。

但是所有具有这种

info.log.2016-08-09
格式的日志仍然完整且不受影响。

所以要考虑的是,一天的info.log不完整的可能性很小,是否可以接受。 (但是,您可以创建更高级的检查器,它不仅会删除文件,还会查找新一天的文件是否存在,如果存在,它会查找里面的内容,然后仅从 info.log 中删除前几天的日志,并且不会删除它一次全部)


2
投票

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

只需使用

createSymlink
symlinkName
选项:

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

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

在旋转时更新符号链接。

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


0
投票

我在

createSymlink
上使用
Windows 11 Pro
时遇到了问题。如果您不以
admin
方式运行应用程序,它将不会创建符号链接。

如果您将符号链接创建为

admin
,然后在没有
admin
权限的情况下运行应用程序,则该链接将被删除。

但这对我来说很有效,就像@lub0v建议的那样

new DailyRotateFile({
...
createSymlink: true,
symlinkName: 'info.log'});
© www.soinside.com 2019 - 2024. All rights reserved.