我正在使用winston創建一個自我記錄器,它允許我在日誌記錄中添加時間戳和行號。代碼可以完成每個功能,但是當它們合併時,它們不能按預期工作。時間戳在node.js winston中添加行號配置時消失
// **help to add timestamp**
var logger = new (winston.Logger)({
transports : [new (winston.transports.Console)({
json : false,
timestamp : true,
colorize: true
}), new winston.transports.File({
filename : __dirname + '/debug.log',
json : true
})]
,exitOnError : false
});
// **help me to add line number**
var logger_info_old = winston.info;
logger.info = function(msg) {
var fileAndLine = traceCaller(1);
return logger_info_old.call(this, fileAndLine + ":" + msg);
}
但是,當添加行號配置時,記錄的時間戳將消失。
例如,在添加行號配置之前。
logger.info("abc");
2013-11-24T09:49:15.914Z - info:339:abc
添加行號配置時
logger.info("abc");
info: (H:\Dropbox\node\fablab\utils\logging.js:85:abc
最佳的結果我想就像
logger.info("abc");
2013-11-24T09:49:15.914Z - info: (H:\Dropbox\node\fablab\app.js:339:abc
我能解決這個問題?
剛剛做了一個基準。要警告的是,添加堆棧跟蹤要慢得多。做10000個日誌的時間從71ms開始,沒有文件和行號到4666ms。這慢了65倍。 traceCaller可能效率很低,但我猜測大部分時間實際上是用於生成堆棧跟蹤:(new Error)。堆棧 –
同意,traceCaller效率低下,但它將用於調試,因此沒問題。非常感謝,jeff – user824624
應該有一個閉包來捕獲'oldFunc',否則所有的日誌func都會被最後一個(默認設置爲'error()')所取代。另外,你爲什麼使用'winston.levels'而不是'logger.levels'? – leesei