温斯顿:如何旋转日志

时间:2012-07-09 22:12:05

标签: node.js flatiron.js

如何在使用Winston处理node.js的日志记录时旋转日志。也就是说,如何为应用程序运行的每一天创建一个新文件?

    var logger = new (winston.Logger)({
       transports: [
          new (winston.transports.Console)(),
          new (winston.transports.File)({ filename: '2012-07-09.log' })
      ]
});

logger.log('info', 'Test Log Message', { anything: 'This is metadata' });

6 个答案:

答案 0 :(得分:23)

该功能已经存在,我们正在制作中使用它,winston.transports.DailyRotateFile:

var timeFormatFn = function() {
    'use strict';
    return moment().format(cfg.timeFormat);
};

var logger = new(winston.Logger)({
    exitOnError: false,
    transports: [
        new(winston.transports.DailyRotateFile)({
            filename: cfg.appLogName,
            dirname: __dirname + '/../' + cfg.logsDirectory,
            datePattern: cfg.rollingDatePattern,
            timestamp: timeFormatFn
        }),
        new(winston.transports.Console)({
            colorize: true,
            timestamp: timeFormatFn
        })
    ]
});

答案 1 :(得分:21)

winston作者和维护者。

每天记录到一个新文件目前是一个开放的功能请求:https://github.com/flatiron/winston/issues/10。很想看到有人实现它。

那就是说,还有其他选择:

  1. 文件传输接受maxsize选项,当日志文件超过特定大小(以字节为单位)时,该选项将旋转日志文件。

  2. 还有一个带有新传输的开放式请求我还没有机会真正深入研究“fileRotate”,这似乎是基于日期的轮换:https://github.com/flatiron/winston/pull/120/files

答案 2 :(得分:3)

根据winston-filerotatedate的作者,它是:

  

winston的文件传输,允许根据大小和时间轮换日志文件。

     

文件传输通过“文件名”选项接受文件名,并将该文件用作主要日志记录目标。   如果文件超过'maxsize'字节,则重命名当前日志文件并创建新的主日志磁贴。   重命名的日志文件的名称格式为'basenameYYYYMMDD [a-z] .bak'。

     

可用选项包括:

     
      
  • 级别:此传输应记录的邮件级别。
  •   
  • silent:布尔标志,指示是否抑制输出。
  •   
  • timestamp:布尔标志,指示我们是否应该在时间戳前面添加输出(默认为true)。如果指定了function,则将使用其返回值而不是timestamps。
  •   
  • filename:要将输出写入的日志文件的文件名。
  •   
  • dirname:将在其中创建日志文件的文件夹。
  •   
  • maxsize:日志文件的最大大小(以字节为单位),如果超出大小,则会创建新文件。
  •   
  • json:如果为true,则消息将记录为JSON(默认为true)。
  •   

答案 3 :(得分:1)

截至2012年12月18日,此功能现已在Winston中提供(请参阅https://github.com/flatiron/winston/pull/205

答案 4 :(得分:1)

您可以使用以下代码每天轮换日志文件:

var winston = require('winston');
require('winston-daily-rotate-file');
var transport = new (winston.transports.DailyRotateFile)({
    filename: './log',
    datePattern: 'yyyy-MM-dd.',
    prepend: true,
    level: info
});
var logger = new (winston.Logger)({
    transports: [
      transport
    ]
});
logger.info('Hello World!');

答案 5 :(得分:0)

其他人已经对这个问题给出了很好的答案。但是对于那些正在寻找如何使用 winston-daily-rotate-file 在更现代的 JavaScript 语法(ES6 及更高版本)中执行此操作的示例的人,以下代码应该会有所帮助:

const { createLogger, transports } = require('winston');
require('winston-daily-rotate-file');

const logger = createLogger({
    level: 'info',
    transports: [
      new transports.DailyRotateFile({
         filename: 'info-%DATE%.log',
         datePattern: 'YYYY-MM-DD',
         zippedArchive: true,
         level: 'info'
      })
    ]
});

logger.log('info', 'Test Log Message', { anything: 'This is metadata' });