2012-12-07 8 views
13

私は数十のモジュールでnode.jsアプリケーションに取り組んでおり、ログにはbunyan(JSON出力、複数の設定可​​能なストリーム)を使用しています。私はすべてのモジュールにわたってインスタンスを実装する方法の良い例を探していましたが、私が学ぶことができる本当にきれいな例であるように見えませんでした。ノード、エクスプレスアプリケーションの共通ロギング - ベストプラクティス?

以下は、動作するアプローチを示していますが、私にとっては非常に醜い(醜い)ようです。私は一般的なノード& commonjs javascriptを初めて使用しているので、改善方法に関する推奨事項を探しています。

モジュール:./lib/logger

// load config file (would like this to be passed in to the constructor) 
nconf.file({ file: fileConfig}); 
var logSetting = nconf.get('log'); 

// instantiate the logger 
var Bunyan = require('bunyan'); 
var log = new Bunyan({ 
    name: logSetting.name, 
streams : [ 
     { stream : process.stdout, 
     level : logSetting.stdoutLevel}, 
     { path : logSetting.logfile, 
      level : logSetting.logfileLevel} 
    ], 
serializers : Bunyan.stdSerializers 
}); 

function Logger() { 
}; 

Logger.prototype.info = function info(e) { log.info(e) }; 
Logger.prototype.debug = function debug(e) { log.debug(e) }; 
Logger.prototype.trace = function trace(e) { log.trace(e) }; 
Logger.prototype.error = function error(e) { log.error(e) }; 
Logger.prototype.warn = function warn(e) { log.warn(e) }; 

module.exports = Logger; 

モジュール:メインアプリ

// create the logger 
var logger = require('./lib/logger) 
var log = new logger(); 

// note: would like to pass in options --> new logger(options) 


module: any project module using logger 
// open the logger (new, rely on singleton...) 
var logger = require('./lib/logger'); 
var log = new logger(); 

又はview the gist

任意の勧告?

EDIT:。

私は

var log = null; 
function Logger(option) { 

// make the singleton pattern explicit 
if (!Logger.log) { 
    Logger.log = this; 
} 
    return Logger.log; 
}; 

行動を「必要」の一環として、シングルトンパターンは、明示的な(というよりも、暗黙的な作り、コンストラクタを変更してから取るように初期設定を変更しましたオプションパラメータ

// initialize the logger 
Logger.prototype.init = function init(options) { 
log = new Bunyan({ 
    name: options.name, 
    streams : [ 
     { stream : process.stdout, 
      level : options.stdoutLevel}, 
     { path : options.logfile, 
      level : options.logfileLevel} 
    ], 
    serializers : Bunyan.stdSerializers  
    }); 
}; 
+0

requireの機能を使用して構築されています。独自のシングルトンを実装することもできますが、それは必ずしも優れているとは限りません。依存性注入は、おそらく行うことができますか? – mtsr

+0

返事をありがとう - はい、それは基本的なシングルトンです。 (a)シングルトンの振る舞いが明示的ではなく暗示されていること、(b)コンストラクタが引数を取るためのきれいな方法を見つけられなかったこと(オプションJSON) (c)参照を(引数として)すべての単一のモジュールに渡すという選択肢が乱雑/冗長であるように見えます。 – dewd

+0

返信いただきありがとうございます!はい、基本的なシングルトンですが、それは定義された動作ではなく暗黙の動作に見えます。私は[悪い練習?](http://stackoverflow.com/questions/9733201/is-it-a-bad-practice-to-use-the-requirejs-module-as-a-singleton)を見てきました。 [シングルトンパターン](http://jasonwyatt.tumblr.com/post/8087061585/singleton-pattern-with-requirejs)に加えて[シングルトンのためにrequireを使う](http://stackoverflow.com/questions/5608685/using-requirejs)グローバルオブジェクトやシングルトンのようなものを渡していること)、これらはコンストラクタの振る舞いを上記よりも優れているように見えます。 – dewd

答えて

1

あなたはNode.jsのと急行使用している場合、あなたはこれを試すことができます。デフォルトでは 、ロギングはExpressで無効になっています。あなたあなたのアプリのためにログを取得するためには何かをしなければなりません。アクセスログについては、Loggerミドルウェアを使用する必要があります。エラーログのために、私たちは、それはあなたを助けるForever.Hopeを使用します。.. ここでは良い例How to Logging Accessで、Node.jsの

+1

ありがとう、これは参考になりました。Bunyanを使って高速ログミドルウェアにも同様のパターンを使用していましたが、ここではすべてのモジュールで同じインスタンスを使用できるクリーンなラッパークラスを作成することに苦労していました。 – dewd

23

Singleton pattern in nodejs - is it needed? のエラーは、実際には、シングルトンはおそらくノードの環境では必要ありません。あなたがする必要があるのは、言う別のファイルにロガーを作成することですlogger.js:

 
var bunyan = require("bunyan"); // Bunyan dependency 
var logger = bunyan.createLogger({name: "myLogger"}); 

module.exports = logger; 

を次に、別のモジュールからこのロガーを取得する:あなたが基本的なシングルトンのようなルックスを持っている何

 
var logger = require("./logger"); 
logger.info("Anything you like"); 
+0

私はこのアプローチが好きですが、初めて使用する前にロガーを設定する方法はありますか?私はこの方法で使いたいですが、出力パスを設定したいと思います。私はlogger.jsに "init"関数を組み込み、その中に "module.exports"を設定しようとしましたが、うまくありません。 –

+0

@lixiangこれは必要なときにいつでもloggerの新しいインスタンスを作成するつもりはありませんか? – PixMach

+1

@PixMach、いいえ、requireモジュールはオブジェクトインスタンスをキャッシュします – lixiang

関連する問題