我可以用javascript扩展控制台对象(用于重新路由日志记录)吗

Can I extend the console object (for rerouting the logging) in javascript?

本文关键字:路由 日志 记录 新路由 用于 javascript 扩展 控制台 我可以 对象      更新时间:2023-09-26

是否可以扩展控制台对象?

我试过类似的东西:

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')