web-dev-qa-db-ja.com

JavaScriptでコンソールオブジェクト(ロギングを再ルーティングするため)を拡張できますか?

コンソールオブジェクトを拡張することは可能ですか?

私は次のようなことを試しました:

Console.prototype.log = function(msg){
    Console.prototype.log.call(msg);
    alert(msg);
}

しかし、これはうまくいきませんでした。 log4javascript のようなフレームワークを介してコンソールオブジェクトにログを追加し、コードで標準のコンソールオブジェクト(log4javascriptが使用できない場合)を使用したいと思います。

前もって感謝します!

30
prefabSOFT

次のことを試してください。

(function() {
    var exLog = console.log;
    console.log = function(msg) {
        exLog.apply(this, arguments);
        alert(msg);
    }
})()
40
Sergey Ilinsky

プロキシパターンを使用します。同様のケースについては、私の回答を参照してください。

JavaScript:alert()のオーバーライド

お役に立てれば

この方法でログ時間を追加することもできます:

momentjsを追加するか、momentの代わりにNew Date()を使用します。

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);
};
3
nitesh singh

ECMAScript2015以降の場合

ECMAScript 2015 標準の新しい Proxy 機能を使用して、グローバル console.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...
}

オンラインデモ

Repl.it

Node.jsユーザー...

... 私はあなたを忘れません。このソースコードを取得し、window.consolegloabl.consoleに置き換えて、コンソールオブジェクトを適切に参照できます(もちろん、alert呼び出しを削除します)。実際、私は最初にこのコードを作成し、Node.jsでテストしました。

1
Amin NAIRI
// 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:」タグを追加するためのより良い方法であることに注意しました。

1
ekerner

これは他の人が与えたのと本当に同じ解決策ですが、これはこれを達成するための最もエレガントでハックの少ない方法だと思います。拡散構文(... args)は 単一の引数が失われないことを確認してください になります。

var _console={...console}

console.log = function(...args) {
    var msg = {...args}[0];
    //YOUR_CODE
    _console.log(...args);
}
0
eds1999