web-dev-qa-db-ja.com

複数のモジュールでウィンストンを使用する

私はいくつかのモジュールを持っています-例えば、server.js、module1.js、...、moduleN.jsとしましょう。

Server.jsでログファイルを定義します。

winston.add(winston.transports.File, { filename: 'mylogfile.log' });

すべてのモジュールで使用します。

それを行う最良の方法は何ですか?私はできた exports.winston=winston;各モジュールで、server.jsで設定しますが、より良い解決策はありますか?

前もって感謝します!

60
Alexander

デフォルトのロガーの概念はこれをうまく処理します。

Winstonは、Winstonに直接要求する(およびその後の要求)取得するデフォルトのロガーを定義します。したがって、このデフォルトのロガーを一度設定するだけで、Vanilla require( 'winston')を介して見事な微調整マルチトランスポートモードで使用できます。

例えばここに、3つのトランスポートを定義する完全なロギングセットアップがあります。私は時々LogglyをMongoDBに交換します。

server.js

var logger=require('./log.js'); 
// requires winston and configures transports for winstons default logger- see code below.

他のすべての.jsファイル

var logger=require('winston'); // this retrieves default logger which was configured in log.js
logger.info("the default logger with my tricked out transports is rockin this module");

log.js-これはDEFAULTロガーの1回限りの構成です

var logger = require('winston');
var Loggly = require('winston-loggly').Loggly;
var loggly_options={ subdomain: "mysubdomain", inputToken: "efake000-000d-000e-a000-xfakee000a00" }
logger.add(Loggly, loggly_options);
logger.add(winston.transports.File, { filename: "../logs/production.log" });
logger.info('Chill Winston, the logs are being captured 3 ways- console, file, and Loggly');
module.exports=logger;

また、より複雑なシナリオでは、ウィンストンコンテナを使用して、他のモジュールの名前付きコンテナからロガーを取得できます。私はこれを使用していません。

これに関する私の唯一の問題は、簡単に修正された展開ホスト上のログディレクトリの欠落でした。

お役に立てれば。

93
Nick

私がすること(これは最良の方法ではないかもしれません)は、アプリケーションを通じて使用するすべてのものをエクスポートする「グローバル」モジュールを使用することです。例えば:

//Define your winston instance
winston.add(winston.transports.File, { filename: 'mylogfile.log' });
exports.logger = winston;

exports.otherGlobals = ....

他のモジュールからこのグローバルに使用されるモジュールを必要とするだけです

var Global = require(/path/to/global.js);

ファイルは最初にロードされた後にキャッシュされるため(グローバルにログステートメントを含めることで確認できます。1回だけログに記録されます)、再度含める場合のオーバーヘッドはほとんどありません。また、すべてのページですべてのグローバルに使用されるモジュールを必要とするよりも、すべてを1つのファイルに入れる方が簡単です。

12
Nick Mitchinson

カスタムの色とレベルを使用したかった。

そこで、デフォルトのconsole-transportを削除して、色付きのものを設定しました

ここに私のlogger.js

var logger = require('winston');

logger.setLevels({
    debug:0,
    info: 1,
    silly:2,
    warn: 3,
    error:4,
});
logger.addColors({
    debug: 'green',
    info:  'cyan',
    silly: 'Magenta',
    warn:  'yellow',
    error: 'red'
});

logger.remove(logger.transports.Console);
logger.add(logger.transports.Console, { level: 'debug', colorize:true });

module.exports = logger;



app.jsからの読み込み:

var logger = require('./lib/log.js');  



他のモジュールからの読み込み:

 var logger = require('winston');        
10
user3575777

(OPがウィンストンについて尋ねるので)少し話題から外れていますが、私はBunyanによる「child-logger」アプローチが好きです:

var bunyan = require('bunyan');
var log = bunyan.createLogger({name: 'myapp'});

app.use(function(req, res, next) {
  req.log = log.child({reqId: uuid()});
  next();
});

app.get('/', function(req, res) {
  req.log.info({user: ...});
});

ロガーはreqオブジェクトを介して利用できるため、OPの問題を解決します(したがって、各モジュールに 'require(log)'は必要ありません)。さらに、特定のリクエストに属するすべてのログエントリには、それらを結び付ける一意のIDがあります。

{"name":"myapp","hostname":"pwony-2","pid":14837,"level":30,"reqId":"XXXX-XX-XXXX","user":"[email protected]","time":"2014-05-26T18:27:43.530Z","v":0}

Winstonがこれもサポートしているかどうかはわかりません。

6
chrisvdb

新しいウィンストンロガーを作成しています。

log.js

'use strict';

const winston = require('winston');

module.exports = new(winston.Logger)({
    transports: [
        new(winston.transports.Console)({
            level: 'info'
        })
    ]
});

a.js

const log = require('./log');

log.info("from a.js");

b.js

const log = require('./log');

log.info("from b.js");
4
Kevin Struillou

私はWinston 3.0.に取り組んでいます。そして、デフォルトのロガーを設定する方法が少し変更されたようです。私のために働く方法は次のとおりです:

log.js //グローバルロガーの設定

_const winston= require('winston');

winston.configure({
  level:"debug",
  format: winston.format.combine(
    winston.format.colorize(),
    winston.format.simple()
  ),
  transports: [
    new winston.transports.Console()
  ]
});
_

他の部分は同じです。アプリケーションの最初で、require('log.js')、およびrequire ('winston'),他のすべてのファイルでは、単にrequire('winston')

3
Haijin

ロガーをグローバル変数にしたい場合は、そのようにグローバル変数に割り当てることによって具体的に行う必要があります

logger.js

var winston = require('winston')

var winston = winston.createLogger({
transports: [
  new (winston.transports.Console)(),
  new (winston.transports.File)({
    filename: './logs/logger.log'
  })
]
});
module.exports=winston;

app.js

let logger  = require('./logger')
global.__logger = logger

someController.js

__logger.info('created log successfully')

注:グローバル変数であることがわかるように、すべてのグローバル変数にプレフィックスを割り当てることをお勧めします。プレフィックスとして__を使用しています(二重低ダッシュ)

0
veeresh yh