20

Node.js でのロギングに Winston を使用したいと考えています。しかし、2 つのログ ファイルを作成する方法がわかりません。1 つはエラー用で、もう 1 つはその他すべて用です。

ただし、単純な方法ではうまくいきません。複数のwinston.transports.Fileトランスポートを追加すると、エラーが発生します。

他の人はこの問題に遭遇し、漠然とした解決策のヒントを持っていますが、本当の答えはありません.

何か案は?

4

5 に答える 5

21

残念ながら、pesho が言及したパッチはまだ公式バージョンに含まれていないようです (プル リクエスト #149の stephenbeeson のコメントを参照)。

そこで、代わりに回避策を使用しました。winston は name 属性を比較するので、name を自分で定義することで欺くことができます。

winston = require 'winston'

logger = new winston.Logger
  transports: [
    new winston.transports.File
      name: 'file#debug'
      level: 'debug'
      filename: '/tmp/debug.log'
    new winston.transports.File
      name: 'file#error'
      level: 'error'
      filename: '/tmp/error.log'
  ]
logger.error 'error' # both logs
logger.debug 'debug' # on debug log

エレガントではないかもしれませんが、少なくとも機能します。

于 2013-06-28T23:12:26.763 に答える
11

それまでの間、次のように同じインターフェースを使用して基本的なラッパーを実装できます。

var winston = require('winston');
var configs = require('./env.js');

var debug = new winston.Logger({
  levels: {
    debug: 0
  },
  transports: [
    new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'debug'}),
    new (winston.transports.Console)({level: 'debug'})
  ]
});

var info = new winston.Logger({
  levels: {
    info: 1
  },
  transports: [
    new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'info'}),
    new (winston.transports.Console)({level: 'info'})
  ]
});

var warn = new winston.Logger({
  levels: {
    warn: 2
  },
  transports: [
    new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'warn'}),
    new (winston.transports.Console)({level: 'warn'})
  ]
});

var error = new winston.Logger({
  levels: {
    error: 3
  },
  transports: [
    new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'error'}),
    new (winston.transports.Console)({level: 'error'})
  ]
});

var exports = {
  debug: function(msg){
    debug.debug(msg);
  },
  info: function(msg){
    info.info(msg);
  },
  warn: function(msg){
    warn.warn(msg);
  },
  error: function(msg){
    error.error(msg);
  },
  log: function(level,msg){
    var lvl = exports[level];
    lvl(msg);
  }
};

module.exports = exports;

これは、基本的な winston API をカバーします。メタデータなどに拡張できます...

于 2014-06-09T16:35:13.900 に答える
9

1 つのロガーで複数のファイル トランスポートを使用できるプル リクエストを送信しました。 https://github.com/flatiron/winston/pull/149

すでに flatiron/winston に統合されています。

私のフォークされたレポも使用できます: https://github.com/pdobrev/winston

于 2012-06-29T12:50:33.133 に答える
5

トランスポートにカスタムnameプロパティを指定するだけで、衝突が発生しなくなります。

const logger = new (winston.Logger)({
  transports: [
    new (winston.transports.Console)(),
    new (winston.transports.File)({ name: 'text', filename: logFile, json: false }),
    new (winston.transports.File)({ name: 'json', filename: logFileJson })
  ]
});

ドキュメントで複数のトランスポートについて詳しく読むことができます: https://github.com/winstonjs/winston#multiple-transports-of-the-same-type

于 2016-07-28T08:32:35.057 に答える