如何基于特定javascript源(方法、文件)或消息内容的条件禁用console.log消息

如何基于特定javascript源(方法、文件)或消息内容的条件禁用console.log消息,javascript,console.log,google-chrome-console,Javascript,Console.log,Google Chrome Console,我正在做一个使用了很多js库的项目,其中一个正在向控制台输出大量的js库,它严重污染了电波,使调试变得非常困难 完全通过使用此 (function (original) { console.enableLogging = function () { console.log = original; }; console.disableLogging = function () { console.log = function () {};

我正在做一个使用了很多js库的项目,其中一个正在向控制台输出大量的js库,它严重污染了电波,使调试变得非常困难

完全通过使用此

(function (original) {
    console.enableLogging = function () {
        console.log = original;
    };
    console.disableLogging = function () {
        console.log = function () {};
    };
})(console.log);
但是它是如何根据消息来源(文件/url)实现的?

它在chrome中工作: …index.html

<html>
<body>
<script>
    (function(){
        var original = console.log;
        console.log = function(){
            var script = document.currentScript;
            alert(script.src);
            if(script.src === 'file:///C:/Users/degr/Desktop/script.js') {
                original.apply(console, arguments)
            }
        }
    })();
    console.log('this will be hidden');
</script>
<script src="script.js"></script>
</body>
</html>

Console.log不适用于index.html,但适用于script.js。这两个文件都位于我的desctop上。

这并不漂亮,但可以使用。
在文件中的“坏”库的
标记之前放置类似的内容:

<script>function GetFile(JSFile) {      
    var MReq = new XMLHttpRequest();        
    MReq.open('GET', JSFile, false);    
    MReq.send();
    eval(MReq.responseText.replace(/console.log\(/g,"(function(){})("));            
}</script>
仅用于短时调试。

序言 开头讨论了一般情况下东西是如何工作的。如果您只关心代码,请跳过介绍并滚动到解决方案标题

介绍 问题: web应用程序中存在大量控制台噪音。大量噪音来自我们无法访问的第三方代码。一些日志噪音也可能来自我们的代码

要求: 通过停止原木来降低噪音。一些日志仍然应该保留,关于这些日志的决定应该与进行日志记录的代码分离。所需的粒度为“每个文件”。我们应该能够选择哪些文件添加或不添加日志消息。最后,这将不会在生产代码中使用

假设:这将在开发人员控制的浏览器中运行。在这种情况下,我将不关注向后兼容性

以前的工作: 可以使用此选项全局启用/禁用首次日志记录

(函数(原始){
console.enableLogging=函数(){
console.log=原件;
};
console.disableLogging=函数(){
console.log=函数(){};
};

})(console.log)我发现最新(2020年7月)的Chrome DevTools控制台中的这些设置非常有用:

  • DevTools |控制台|(侧边栏图标)|用户消息
  • DevTools |控制台|(齿轮图标)|仅选择上下文
  • DevTools |控制台|(齿轮图标)|隐藏网络

  • 我最喜欢(1),我只看到来自“我的”代码的消息。(2) 从我的iframe中隐藏消息。

    如果是修改文件的选项,您可以在文件顶部设置一个标志,用于禁用该文件的日志:

    var DEBUG = false;
    DEBUG && console.log("cyberpunk 2077");
    
    要禁用所有js文件的日志,请将其放在任何js文件的顶部:

    var DEBUG = false;
    if (!DEBUG) {
       console.log = () => {};
     }
    

    我想您需要一个解决方案,其中JS文件没有定义某个标准的模块,或者具有保护全局命名空间的IIFE?如何确定应该重新绘制哪个
    console.log
    ?您希望外部控制(例如,使用某种配置)还是严格控制每个文件(例如,在每个文件中更改)?@vlaz我无法真正更改他们从第三方加载的所有文件,但我想我可以在加载后进行调整,因为这只是在我调试时进行的。。。如果我有访问权限,那么只需替换
    console.log
    ->
    \\console.log
    :)好的,我猜您有第三方的东西记录您不感兴趣的信息,您想禁用它。您想禁用所有第三方日志记录还是只禁用其中的一部分?您好,谢谢您的回答,很遗憾
    document.currentScript
    返回
    null
    ,然后失败,出现
    VM119:5未捕获类型错误:无法读取
    警报(script.src)上null的属性“src”
    from需要注意的是,如果脚本中的代码被作为回调或事件处理程序调用,那么它将不会引用元素;它只会在最初处理时引用元素。根据@Maximus note,认为这是不可能的。如果currentScrip仅在初始过程中可用,则无法获取唯一标识符来区分应显示的内容。@degr Nothing is Canable…:)我现在正在尝试使用
    参数。被调用方
    。。。。是的,这很有道理,你可以继续讨论参数。callee.caller.caller.caller.caller。。。。链接以查找顶级组件,但这取决于您的项目结构。早上好,vlaz,最后一个(具有白名单文件名)没有飞到我身边,但是所有污染消息都“收到”了我的消息,因此我修改了您的选择性听力示例
    const originallo=console.log;console.log=函数selectiveHearning(){if(参数[0].indexOf(“RECEIVED:”)!=-1{return;}return originallo.apply(console,参数)}
    这样做了。我可以建议不要把文件列入白名单,而是把它们列入黑名单。无论如何,谢谢这是一个很好的答案…我的坏。。。它确实有效,必须更改此位
    if(whitelist.some(entry=>callingFile.includes(entry)){return;}else{savedFunctions.log.apply(console,arguments);}
    以将其用作黑名单…是的,我之所以要将其列入白名单,是因为您通常不知道哪些文件会产生噪音,哪些文件不会产生噪音,所以,如果你只对其中一些感兴趣,你可以添加这些。当然,如果这更有意义的话,你也可以将其列入黑名单。Ofc you do:)我现在正等着给你赏金,因为你有这么好的答案。。。。
    GetFile("badLib.js")
    
    var DEBUG = false;
    DEBUG && console.log("cyberpunk 2077");
    
    var DEBUG = false;
    if (!DEBUG) {
       console.log = () => {};
     }