我可以用javascript扩展控制台对象(用于重新路由日志记录)吗
Can I extend the console object (for rerouting the logging) in javascript?
是否可以扩展控制台对象?
我试过类似的东西:
Console.prototype.log = function(msg){
Console.prototype.log.call(msg);
alert(msg);
}
但这并没有奏效。我想通过像log4javascript这样的框架向控制台对象添加额外的日志记录,并且在我的代码中仍然使用标准控制台对象(在log4javascript不可用的情况下)。
提前感谢!
尝试以下操作:
(function() {
var exLog = console.log;
console.log = function(msg) {
exLog.apply(this, arguments);
alert(msg);
}
})()
这确实是其他人给出的相同解决方案,但我相信这是实现这一点的最优雅、最不技巧的方法。排列语法(…args)确保没有丢失任何一个参数。
var _console={...console}
console.log = function(...args) {
var msg = {...args}[0];
//YOUR_CODE
_console.log(...args);
}
您也可以通过这种方式添加日志时间:
添加了Momentjs或使用New Date()而不是moment。
var oldConsole = console.log;
console.log = function(){
var timestamp = "[" + moment().format("YYYY-MM-DD HH:mm:ss:SSS") + "] ";
Array.prototype.unshift.call(arguments, timestamp);
oldConsole.apply(this, arguments);
};
适用于ECMAScript 2015及更高版本
您可以使用ECMAScript 2015标准中较新的代理功能来"劫持"全局控制台.log。
源代码
'use strict';
class Mocker {
static mockConsoleLog() {
Mocker.oldGlobalConsole = window.console;
window.console = new Proxy(window.console, {
get(target, property) {
if (property === 'log') {
return function(...parameters) {
Mocker.consoleLogReturnValue = parameters.join(' ');
}
}
return target[property];
}
});
}
static unmockConsoleLog() {
window.console = Mocker.oldGlobalConsole;
}
}
Mocker.mockConsoleLog();
console.log('hello'); // nothing happens here
Mocker.unmockConsoleLog();
if (Mocker.consoleLogReturnValue === 'hello') {
console.log('Hello world!'); // Hello world!
alert(Mocker.consoleLogReturnValue);
// anything you want to do with the console log return value here...
}
在线演示
回复
Node.js用户
我不会忘记你。您可以使用此源代码并将window.console
替换为gloabl.console
,以正确引用控制台对象(当然,还可以取消alert
调用)。事实上,我最初编写了这段代码,并在Node.js.
// console aliases and verbose logger - console doesnt prototype
var c = console;
c.l = c.log,
c.e = c.error,
c.v = c.verbose = function() {
if (!myclass || !myclass.verbose) // verbose switch
return;
var args = Array.prototype.slice.call(arguments); // toArray
args.unshift('Verbose:');
c.l.apply(this, args); // log
};
// you can then do
var myclass = new myClass();
myclass.prototype.verbose = false;
// generally these calls would be inside your class
c.v('1 This will NOT log as verbose == false');
c.l('2 This will log');
myclass.verbose = true;
c.v('3 This will log');
我注意到上面nitesh使用Array.prototype.unshift.call是添加"Verbose:"标记的更好方法。
您可以使用以下方法覆盖console.log
函数的默认行为,下面的示例演示了使用覆盖的函数记录行号。
let line = 0;
const log = console.log;
console.log = (...data) => log(`${++line} ===>`, ...data)
console.log(11, 1, 2)
console.log(11, 1, 'some')
相关文章:
- Emberjs应用程序加载在除Index之外的所有路由上
- 正在使用$location.path(.)路由ng视图
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- /undefined在我的404错误日志中多次出现
- 未激发路由的控制器属性上的观察者
- 如何使用Protractor从Chrome控制台获取所有日志
- AngularJS ui路由器html5模式中断路由
- 发送json对象或使用express路由呈现视图
- 使用主干网和rails的静态页面路由
- 自定义运行时Can'在谷歌应用引擎中看不到我的自定义日志
- 如何使用Passport保护路由终结点
- 有没有办法用routerLink/router.navigation附加查询/路由参数
- Nodejs和express路由,如何处理客户端的承诺
- 日志Javascript&电子(原子外壳)
- 在log4javascript中添加自定义日志级别
- TinyMCE实例在切换角度路由选项时会消失
- 什么'在Express中路由时,应用程序级中间件和路由器级中间件之间的区别是什么
- 按压“;输入“;将值打印到控制台日志
- 使用Ampersand.js路由模块化应用程序
- 我可以用javascript扩展控制台对象(用于重新路由日志记录)吗