45

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

6 回答 6

30

温斯顿的作者和维护者在这里。

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

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

  1. 文件传输接受一个 maxsize 选项,该选项将在日志文件超过特定字节大小时轮换日志文件。

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

于 2012-07-10T08:04:56.733 回答
25

该功能存在,我们正在生产中使用它,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
        })
    ]
});
于 2014-03-08T05:02:24.663 回答
6

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

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.createLogger)({
    transports: [
      transport
    ]
});
logger.info('Hello World!');
于 2018-01-29T11:11:59.000 回答
3

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

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

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

可用选项有:

  • 级别:此传输应记录的消息级别。
  • 静音:布尔标志,指示是否抑制输出。
  • 时间戳:布尔标志,指示我们是否应该在输出前加上时间戳(默认为真)。如果指定了函数,则将使用其返回值而不是时间戳。
  • 文件名:要写入输出的日志文件的文件名。
  • dirname:将在其中创建日志文件的文件夹。
  • maxsize:日志文件的最大大小(以字节为单位),如果超过大小,则创建一个新文件。
  • json:如果为 true,则消息将记录为 JSON(默认为 true)。
于 2014-01-21T03:40:15.230 回答
0

自 2012 年 12 月 18 日起,此功能现已在 Winston 中可用(请参阅https://github.com/flatiron/winston/pull/205

于 2014-08-26T09:35:33.440 回答
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' });
于 2021-05-18T21:32:44.870 回答