私は、ログ用にNode.jsにWinstonを使用しています。私は各ログメッセージに個別にメタデータを追加できることは知っていますが、毎回指定したくないため、すべてのログメッセージ(アプリケーション名など)に追加されるデフォルトのメタデータセットを指定する方法があります私はログメッセージを送る必要があります。Node.js:Winston:すべてのログメッセージにデフォルトのメタデータを追加できますか?
答えて
はこれを行うには、組み込みの方法はありませんが、あなたは間違いなくそれを自分で追加することができます - ここでの方法は次のとおりです。
まず、通常はあなたのようなあなたのロガーを考え設定します。たとえば:
var logger = new (winston.Logger)({
"exitOnError" : true,
"transports" : [
new (winston.transports.Console)({ "colorize" : true, "level" : "silly", "silent" : false, "handleExceptions" : false }),
]
});
は、次に(これは常にレベルのメソッドによって呼び出された - logger.foo()
が実際にlogger.log('foo')
呼び出します。)ログ()メソッドをオーバーライド
logger.log = function(){
var args = arguments;
if(args[2]) args[3] = args[2];
args[2] = {
"foo" : "bar"
}
winston.Logger.prototype.log.apply(this,args);
}
私は上記のやっているすべては、それを作っていますlogger.log()
が呼び出されると、上記のメソッドが呼び出され、メタデータ(この場合はfoo
キーを含むオブジェクト)が追加されます。次に、適切なコンテキストからwinstonのLogger.logメソッドを呼び出します。
上記のコードは、単にロガーをエクスポート下部に、作成したモジュールに次のようになります。
module.exports = logger;
とあなたのサブクラスでウィンストンモジュールの代わりにロガーモジュールをインポートします。
var logger = require('./logger.js');
役に立てば幸い!
Thanks Jesse :) –
注:これは、ログ・ステートメントで指定したメタデータをすべて上書きします。これを補うためにアンダースコアの '_.defaults()'を使うことができます。あるいは、args [2]のチェックを追加して、これを回避するために存在する場合は上書きすることはできません。 – Jesse
引数を上書きするのではなく、単に引数を追加します。 logger.log = function(){ var args = arguments; if(args [2]){ args [2] .foo = "bar" } winston.Logger.prototype.log.apply(this、args); } – harryBundles
以上のlog4j(S)のような出力を持つ別のオプション:
出力(JSONまたはライン)にラベルを追加しますコンソールの輸送で(現在は文書化されていない)「ラベル」プロパティがあります:
var logger = require('./logger')(__filename);
出力例:
var _ = require('lodash');
var winston = require('winston');
var path = require('path');
var baseDir = path.resolve(__dirname, '..');
// SETUP WINSTON LOGGER
var container = new winston.Container();
container.add("exception", {
console: {
handleExceptions: true,
timestamp: true,
label: "EXCEPTION",
colorize: true
}
});
container.get("exception").exitOnError = false;
var keys = [];
module.exports = function(filename) {
var label = path.relative(baseDir, filename);
if (!_.contains(keys, label)) {
container.add(label, {
console: {
handleExceptions: false,
level: 'debug',
timestamp: true,
label: label,
colorize: true
}
});
keys.push(label);
}
var logger = container.get(label);
logger.exitOnError = false;
return logger;
};
そして、他のモジュールでは、このようにそれを必要と
2014-07-23T07:05:27.770Z - info: [config/config.js] .......
this blogに基づいてutil-extendを使用してより良い方法を見つけました。 Logger.infoとlogger.log( "info"、message)をキャッチするのに便利だとわかったすべてのケースでデータを追加し、他の引数を上書きしません。
logger.log = function(){
var args = arguments;
var level = args[0];
var newArgs = {
foo: "bar",
baz: "abc"
};
var originalMeta = args[2] || {};
args[2] = extend(originalMeta, newArgs);
winston.Logger.prototype.log.apply(this,args);
};
コンソールとログに出力されます。ウィンストンv2の
(コメントを参照してください)
rewriters
はこれを行うための文書化され、公式の方法であること、今があります:
logger.rewriters.push(function(level, msg, meta) {
meta.app = 'myApp';
return meta;
});
このthrought行くすべてのメタデータプロパティapp
が追加されますロガー。ロガーを構築する際に
また、それを宣言することができます。
new (winston.Logger)({
level: config.log[file].level,
rewriters: [
(level, msg, meta) => {
meta.app = 'myApp';
return meta;
}
],
transports: [
/*your transports*/
]
});
この回答は、より適切かつ公式な方法です。 – shankshera
正解である必要があります –
winston v3はメタデータを変更する可能性を排除しているようです。つまり、メタデータを追加する場合は、@Jesseがwinston v3&+の推奨ソリューションです。出力ログがJSONではなく文字列の場合、カスタムフォーマットでジョブを実行できます(cfgithub.com/winstonjs/winston/issues/1140) –
- 1. すべてのBotoリクエストに「デフォルト」ヘッダーを追加しますか?
- 2. MSBuildのデフォルトのItemDefinitionGroupメタデータにItemListを追加するには?
- 3. リレーショナルデータベースのすべてのテーブルのすべてのセルにメタデータを追加する方法はありますか?
- 4. どのようにしてメイプルポームにメタデータを追加できますか
- 5. データアノテーションを使用して、子モデルのベースモデルプロパティに追加メタデータを追加できますか?
- 6. iPhoneのドキュメントフォルダにデフォルトのドキュメントを追加できますか?
- 7. カスタムディスプレイまたはエディタテンプレートから追加のメタデータ情報にアクセスできますか?
- 8. アンドロイド4のデフォルト書体にカスタムフォントを追加できますか?
- 9. デフォルトのコピーコンストラクタに「追加」することはできますか?
- 10. 保存/コミット/アップロード時にeclipseでソースファイルにメタデータを追加できますか?
- 11. MVC3アプリケーションでUIhintと追加のメタデータを結合しますか?
- 12. QStandardItemModelにすべての行を追加できません
- 13. JQuery tablesorterのカスタムパーサーをすべてのヘッダーに追加できますか?
- 14. レイジーシーケンスにメタデータを追加する
- 15. Delphiのデフォルトの "Sender:TObject"に加えて、OnClickイベントにパラメータを追加することはできますか?
- 16. どのようにすべてのログメッセージ(Rails 3)にセッションIDを付加するのですか?
- 17. Facebook Graph Api - 「デフォルト」フィールドに加えていくつかのフィールドを追加できますか?
- 18. Xcode - すべてのターゲットに新しいファイルを追加するデフォルト
- 19. RestKitはすべてのリクエストにカスタムヘッダーを追加しますか?
- 20. 画像にメタデータを追加してPythonでS3にアップロード
- 21. すべてのUserControlにトリガを追加
- 22. 画像のメタデータを調べるときに、exif-dataにフィールドを操作/追加するiptc
- 23. postgresqlにテーブルのメタデータを追加することは可能ですか?
- 24. "user"で始まるすべてのリンクにイベントを追加しますか?
- 25. ビジュアルスタジオでは、どのようにjavascriptファイルのすべての関数にブレークポイントを追加できますか?
- 26. メタデータをクロージャーベクトルに追加するにはどうすればよいですか?
- 27. Search Serverのファイルにメタデータを追加する
- 28. SharePoint Foundation 2010のサイトにメタデータを追加するベストプラクティス
- 29. Wordpressのウェブサイトに基本メタデータを追加する
- 30. すべてのファーストクラスを追加しますか?
これを行うには、文書化の方法が用意されました、私の答えを参照してください。 – DrakaSAN