gpt4 book ai didi

javascript - 无法覆盖谷歌应用脚​​本的 console.log()

转载 作者:行者123 更新时间:2023-12-02 18:22:11 25 4
gpt4 key购买 nike

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

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

自解压功能会覆盖 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 app 脚本,并且日志不断写入。

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

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

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

  • 自解压
  • 自解压2
  • 禁用日志

对于 allowLog=true 的情况:

  • 自解压
  • 自解压2
  • func1 日志消息
  • 允许

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

最佳答案

这是因为consolelog 属性不是可写。您可以使用 Object.getOwnPropertyDescriptors 进行检查。然而,它仍然是configurable .因此,您可以删除 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");
}

关于javascript - 无法覆盖谷歌应用脚​​本的 console.log(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70757154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com