无法覆盖 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
):
- 自解压
- 自解压2
- 禁用日志
对于allowLog=true
的情况:
- 自解压
- 自解压2
- func1 日志消息
- 允许
前两行self extracting和self 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
这是因为 console
的 log
属性 不是 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");
}
我有一个很大的 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
):
- 自解压
- 自解压2
- 禁用日志
对于allowLog=true
的情况:
- 自解压
- 自解压2
- func1 日志消息
- 允许
前两行self extracting和self 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
这是因为 console
的 log
属性 不是 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");
}