Преамбула
Известная библиотека Winston имеет ту же проблему, что и многие другие библиотеки, которые служат для ведения многотранспортного журнала. Когда один из транспортов console
сообщенное сообщение в консоли отладчика (браузер или любая среда для Node.js) пропускает очень мощную информацию: место, где начался начальный вызов (файл разработчика), а вместо этого место вызова внутри библиотеки. В этом случае все сообщения из разных файлов/мест сообщаются, как если бы они регистрировались из одного места.
Решения пробовали
У меня есть два подхода. Один из них был трюк в браузере / Node, когда они вызывают место вызова console.log
. Единственный способ, которым я нашел, это сделать через исходные карты. Это технология, которая позволяет отображать мини-источники js в исходные источники и отлаживать их, глядя на полный источник. Однако это предполагает, что существует один переход от реального (уменьшенного) источника к оригиналу. А в случае замены источника console.log
в потенциальной библиотеке mylogger
должен быть динамическим и отражать несколько мест, где вызывается mylogger.log
. Я не нашел способ сделать это динамически, так как браузер загружает файл карты только один раз.
Другим было подставить вызов console.log
, а внутри пользовательской функции вызывать все остальные транспорты (это может быть тот же Winston). Однако, если мы сделаем простую замену, как показано ниже
var originalLog = console.log;
console.__proto__.log = function(message){
message = [new Date().toISOString(), message].join(' ');
originalLog.call(console, message);
//here send via other transports
body.innerHTML = body.innerHTML + message + '<br/>';
};
место вызова originalLog
всегда будет одинаковым, и оно будет сообщено соответствующим образом на выходе консоли. Поэтому я думал перехватить вызов console.log
, но оставил исходную нативную функцию на месте. Но мне не удалось получить параметры вызова.
function interceptGettingLog(){
var originalLog = console.log;
Object.defineProperties(console.__proto__, {
log: {
get: function(){
//arguments is always empty here, which is not a big surprise
originalLog.call(console, 'log accessed ' + JSON.stringify(arguments));
return originalLog;
}
}
});
}
Вопрос короче
Кто-нибудь знает другой подход к протоколированию или способ обмана в браузере / Node.js при вызове console.log
? Цель состоит в том, чтобы иметь многоуровневый многотранспортный логгер, который позволит переключать многословие и транспорты в конфигурации (которые будут отличаться для разработки и производства), имеют полную мощность console.log
и в то же время опрятный синтаксис, т.е. один вызов функции в месте, где разработчику нужно что-то записывать. Спасибо за чтение:)