无法覆盖 google 应用脚本的 console.log()

Cannot override google app script's console.log()

我有一个很大的 google 应用程序脚本,将大量日志行写入日志浏览器。如果需要,我希望能够禁用或启用日志记录。

这是一段在浏览器上似乎能正常工作的代码。 这里 allowlog 在代码中设置,但它将从外部源检索。这对于 post.

的目的并不重要

自解压功能会覆盖 console.log 并在需要时阻止日志记录。

let allowLog = false; 

function func1(){
  console.log("func1 log msg");
}

(function(){
  //test log 1
  console.log("self extracting");

  //keep ref to global console.log
  const _consolelog = console.log;

  //test log 2 - verify it works
  _consolelog("self extracting2");


//override global console.log
  console.log = function(val){
    if (allowLog){
      _consolelog(val);
      _consolelog("allowing");
    }else{
      _consolelog("log disabled");
    }

  }

})();

此代码不适用于 google 应用程序脚本,并且日志会继续写入。

在应用程序脚本中,我可以在加载模块时看到 console.log("self extracting");_consolelog("self extracting2"); 日志消息。但是,当调用 func1 时,即使 allowLog = false 也会写入日志。 _consolelog("allowing");_consolelog("log disabled"); 均未记录。全局 console.log 未被覆盖。

为什么会这样,如何(如果有的话)解决它?

上述代码的预期日志是 (allowLog=false):

对于allowLog=true的情况:

前两行self extractingself extracting2应该只打印一次,当执行匿名自调用函数时。另一个应该来自覆盖全局函数的内部函数

你是这个意思吗?

Logger.log('Test1');  // it will print as usual

var _log = Logger.log
Logger.log = function(_){};

Logger.log('Test2'); // <-- it will not print since we disabled the 'log()' method

Logger.log = _log;   // restore the method 'log()' back
Logger.log('Test3'); // it will print again

输出:

Test1
Test3

这是因为 consolelog 属性 不是 writable。您可以使用 Object.getOwnPropertyDescriptors 进行检查。然而,还是configurable。因此,您可以 delete log 属性 并设置一个新值。

let allowLog = false; 
(function(){
  //test log 1
  console.log("self extracting");

  //keep ref to global console.log
  const _consolelog = console.log;

  //test log 2 - verify it works
  _consolelog("self extracting2");


//override global console.log
//console.log(Object.getOwnPropertyDescriptors(console));
/*{ toString: 
   { value: [Function],
     writable: true,
     enumerable: true,
     configurable: true },
  time: 
   { value: [Function],
     writable: true,
     enumerable: true,
     configurable: true },
  timeEnd: 
   { value: [Function],
     writable: true,
     enumerable: true,
     configurable: true },
  error: 
   { value: [Function],
     writable: false,
     enumerable: true,
     configurable: true },
  info: 
   { value: [Function],
     writable: false,
     enumerable: true,
     configurable: true },
  log: 
   { value: [Function],
     writable: false,
     enumerable: true,
     configurable: true },
  warn: 
   { value: [Function],
     writable: false,
     enumerable: true,
     configurable: true } }*/
  delete console.log;
  console.log = function (val){
    if (allowLog){
      _consolelog(val);
      _consolelog("allowing");
    }else{
      _consolelog("log disabled");
    }
  }
})();

function func1(){
  console.log("func1 log msg");
}