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 / pull / 120 / files

于 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のファイルトランスポート。

ファイルトランスポートは、「filename」オプションを介してファイル名を受け入れ、そのファイルをプライマリロギングターゲットとして使用します。ファイルが「maxsize」バイトを超えて大きくなると、現在のログファイルの名前が変更され、新しいプライマリログタイルが作成されます。名前が変更されたログファイルの名前は、「basenameYYYYMMDD[az].bak」のようにフォーマットされます。

使用可能なオプションは次のとおりです。

  • level:このトランスポートがログに記録する必要があるメッセージのレベル。
  • サイレント:出力を抑制するかどうかを示すブールフラグ。
  • タイムスタンプ:出力の前にタイムスタンプを付けるかどうかを示すブールフラグ(デフォルトはtrue)。関数が指定されている場合、タイムスタンプの代わりにその戻り値が使用されます。
  • filename:出力を書き込むログファイルのファイル名。
  • 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 に答える