8

Winstonのドキュメントには、ストリーミング ログに関するセクションがあり、次のように書かれています。

ストリーミングを使用すると、選択したトランスポートからログをストリーミングして戻すことができます。

次のコード例を示します。

//
// Start at the end.
//
winston.stream({ start: -1 }).on('log', function(log) {
  console.log(log);
});

これを読むと、追加された新しいログメッセージはそれぞれコンソールに出力されるということです。config は、ファイルの{start: -1}末尾からストリームを開始するように指示するため、新しいログ エントリのみが出力されます。次の Node スクリプトを実行すると、test.logファイルの既存の各行がコンソールに出力され、その後 500 ミリ秒ごとに新しいオブジェクトが出力されると予想されます。

var winston = require('winston');
winston.add(winston.transports.File, {
    filename: 'test.log'
});
winston.remove(winston.transports.Console);
winston.stream().on('log', function(log) {
    console.log(log);
});

setInterval(function(){
    winston.log('info', 'help');
}, 500);

次のような出力が表示されることを期待しています。

{"level":"info","message":"help","timestamp":"2013-12-10T05:55:15.806Z"}
{"level":"info","message":"help","timestamp":"2013-12-10T05:55:16.307Z"}
{"level":"info","message":"help","timestamp":"2013-12-10T05:55:16.809Z"}
{"level":"info","message":"help","timestamp":"2013-12-10T05:55:17.309Z"}
{"level":"info","message":"help","timestamp":"2013-12-10T05:56:48.316Z"}

実際に発生するのは、ロギングがファイル トランスポートで期待どおりに機能することです (ファイルは 500 ミリ秒ごとに新しいログ エントリを取得します) が、コンソールへの出力はありません。console.log(log)回線が呼び出されることはありません。

Winston のログ ストリームの目的を明らかに見落としていたり​​、誤解していたり​​しませんか?

4

1 に答える 1

9

あなたが説明しているのと同じ種類のバグを経験しました。私の結論は、デフォルトのロガーは関数でvar winston = require('winston')動作せず、使用できるようにもならないということです。querystreamEventEmitterwinston.on('logging', function() {...})

使用する必要がある解決策は、次のように独自のロガーをインスタンス化することです。

  var logger = new (winston.Logger)({
    transports: [
      new (winston.transports.Console)({ level: 'info' }),
      new (winston.transports.File)({ filename: 'app.log' })
    ]
  });

次に、いくつかのログを記録します。

  setInterval(function(){
    logger.log('info', 'logging some stuff..');
  }, 500);

次に、次を使用して、すでにログに記録されたエントリをストリーミングできますstream

  logger.stream().on('log', function(log) {
    console.log('>>> ', log);
  });

streamログエントリをオンザフライでストリーミングするのではなく、すでにログに記録したすべてのエントリをストリーミングするだけなので、関数を誤解していると思います。イベントをロガーに接続するには、ロガー オブジェクトで「logging」イベントを使用できます。

  logger.on('logging', function (transport, level, msg, meta) {
    // [msg] and [meta] have now been logged at [level] to [transport]
    console.log("[%s] and [%s] have now been logged at [%s] to [%s]",
                 msg, JSON.stringify(meta), level, transport.name);
  });

これがデフォルトのロガーでサポートされていない理由がわかりません。この投稿の冒頭で述べたように、デフォルトのロガーでqueryまたはstream関数を使用すると、非同期ライブラリ (winston への依存) 内でエラーが発生します。

于 2014-03-28T22:49:47.860 に答える