私は数十のモジュールで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();
任意の勧告?
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
});
};
requireの機能を使用して構築されています。独自のシングルトンを実装することもできますが、それは必ずしも優れているとは限りません。依存性注入は、おそらく行うことができますか? – mtsr
返事をありがとう - はい、それは基本的なシングルトンです。 (a)シングルトンの振る舞いが明示的ではなく暗示されていること、(b)コンストラクタが引数を取るためのきれいな方法を見つけられなかったこと(オプションJSON) (c)参照を(引数として)すべての単一のモジュールに渡すという選択肢が乱雑/冗長であるように見えます。 – dewd
返信いただきありがとうございます!はい、基本的なシングルトンですが、それは定義された動作ではなく暗黙の動作に見えます。私は[悪い練習?](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