不调试时如何禁用 console.log? [复制]

Posted

技术标签:

【中文标题】不调试时如何禁用 console.log? [复制]【英文标题】:How do I disable console.log when I am not debugging? [duplicate] 【发布时间】:2011-11-21 23:35:44 【问题描述】:

我的代码中有许多 console.log或任何其他控制台调用),我只想使用它们 当我的应用程序处于某种“调试模式”时。

我似乎无法使用某种记录器功能并在内部使用console.log,因为那样我就不知道是哪一行触发了它。也许只有一个 try/catch,但我的日志非常笼统,我不想在我的代码中使用 try/catch。

你会推荐什么?

【问题讨论】:

生产代码不应登录到控制台。 我遇到了这个:ariya.ofilabs.com/2013/04/… 如果你在一个非常轻量级的 node.js docker 容器中,我认为登录到控制台很好 我相信在构建过程中删除任何 console.* 的简单 regex 是非常好的解决方案,因为 regex 足够健壮 【参考方案1】:

自 2014 年以来,我只使用 GULP(并推荐大家使用,这是一个了不起的工具),并且我安装了一个名为 stripDebug 的软件包,它可以为你做这件事。

(我也在生产中使用uglifyclosureCompiler


更新(2019 年 6 月 20 日)

有一个Babel Macro 会自动删除所有console 语句:

https://www.npmjs.com/package/dev-console.macro

【讨论】:

没有人会使用全新的构建系统只是来处理“console.log in production”问题。 是的,但是不使用任何任务管理器(例如 GULP 或 GRUNT)的网站可能远远落后于 Web 开发的最佳实践。我想鼓励人们以正确的方式为网络开发,我真的相信没有任务运行器肯定会更慢维护。 如果你拒绝使用 GRUNT 或 GULP,你也可以运行一个 NPM 来为你做这件事...... 任何为生产做严肃的 JS 代码的人都应该使用一些任务运行器来处理 JS 代码,使其对开发具有可读性,并针对生产进行优化 - 包括剥离 console.logs、cmets 等。GULP 和 GRUNT 是救生员。我赞成这个答案,因为它提供了一个适用于生产和开发的可靠解决方案。【参考方案2】:

控制台不仅可以输出日志,还可以输出错误警告等。 这是一个覆盖所有控制台输出的函数

(function () 
    var method;
    var noop = function noop()  ;
    var methods = [
    'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
    'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
    'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
    'timeStamp', 'trace', 'warn'
    ];
    var length = methods.length;
    var console = (window.console = window.console || );

    while (length--) 
        method = methods[length];
        console[method] = noop;
    
());

请参阅此处的详细帖子 https://stapp.space/disable-javascript-console-on-production/

【讨论】:

【参考方案3】:

这个 Tiny 包装器覆盖将包装原始 console.log 方法,其中包含一个内部检查功能,您可以从外部控制它,如果您想查看控制台日志而不是查看控制台日志,则加深。

我选择window.allowConsole 只是作为示例标志,但在现实生活中使用它可能会是别的东西。取决于你的框架。

(function(cl)
  console.log = function()
    if( window.allowConsole )
      cl(...arguments); 
  
)(console.log)

用法:

// in development (allow logging)
window.allowConsole = true;
console.log(1,[1,2,3],a:1);

// in production (disallow logging)
window.allowConsole = false;
console.log(1,[1,2,3],a:1);

此覆盖应在代码层次结构中尽可能“高”地实现,以便在发生之前“捕获”所有日志。这可以扩展到所有其他console 方法,例如warntimedir 等。

【讨论】:

【参考方案4】:
// In Development:
var debugMode = true

// In Prod:
var debugMode = false

// This function logs console messages when debugMode is true .
function debugLog(logMessage) 
    if (debugMode) 
        console.log(logMessage);
    


// Use the function instead of console.log
debugLog("This is a debug message");

【讨论】:

它无法将日志处理为console.log(logMessage1, log2, log3, ...)【参考方案5】:

最新版本的 chrome 显示哪个文件中的哪一行代码触发了 console.log。如果你正在寻找一个日志管理系统,你可以试试logeek 它可以让你控制你想要查看的日志组。

【讨论】:

【参考方案6】:

另一种在生产中禁用 console.log 并使其保持在开发中的方法。

// overriding console.log in production
if(window.location.host.indexOf('localhost:9000') < 0) 
    console.log = function();

您可以更改开发设置,例如 localhost 和端口。

【讨论】:

【参考方案7】:

破坏全局函数通常是个坏主意。

相反,您可以将代码中的所有 console.log 实例替换为 LOG,并在代码的开头:

var LOG = debug ? console.log.bind(console) : function () ;

这仍将显示正确的行号,并在需要时为第三方内容保留预期的 console.log 函数。

【讨论】:

您可以通过在站点的命名空间中添加这样的日志功能来避免污染全局命名空间。例如myNamespace.log = myNamespace.DEBUG ? console.log : function();. @NickG。 -- 你需要像我在我的例子中那样使用Function::bind 才能使console.log 工作 -- 否则当你尝试执行它时你会得到一个权限异常。【参考方案8】:

只需将 console.log 替换为用于生产的空函数即可。

if (!DEBUG_MODE_ON) 
    console = console || ;
    console.log = function();

【讨论】:

这是一个黑客。您在生产中浪费计算 @Raynos:不,正如我所说,我同意这是一个黑客行为。只是想指出这一点:) @Raynos 说实话,多次调用一个空函数与应用程序的其余部分相比没什么,这只是解决问题的快速方法。 是的,我看到很多数学障碍者对任何额外处理的下意识反应。如果您正在执行 10^6 个 console.logs,则调用空函数可能仍然存在问题。否则,对空函数的数百次客户端调用几乎可以忽略不计。 @Raynos,“过早的优化是万恶之源。”你真的知道这个解决方案会显着降低性能的任何真实案例吗?你做过基准测试吗?我敢打赌,花在编写删除所有日志记录(并且永远不会弄乱代码)的批处理脚本上的时间可以更好地投入......【参考方案9】:

此代码适用于我:

if(console=='undefined' || !console || console==null) 
  var console = 
    log : function (string) 
        // nothing to do here!!
    
  

【讨论】:

【参考方案10】:

简单。

添加一个小 bash 脚本,查找对 console.log 的所有引用并删除它们。

确保此批处理脚本作为您部署到生产的一部分运行。

不要将console.log 填充为空函数,这会浪费计算量和空间。

【讨论】:

用批处理文件解析 JavaScript?开个玩笑! sed -i "/console\.log/d" &lt;filename&gt; 之类的东西可以做到这一点(GNU sed 示例),前提是您将所有 console.logs 保留在自己的行中,并且在 if 块中没有任何没有大括号的内容。 这可能会适得其反。很多事情都可能在这里出错。【参考方案11】:

我可能会滥用 JavaScript 的 logical AND operator 的 short-circuiting 特性并替换以下实例:

console.log("Foo.");

与:

DEBUG && console.log("Foo.");

假设DEBUG 是一个全局变量,如果启用调试,则计算结果为true

此策略避免了对console.log() 进行绝育,因此如果确实需要(例如,跟踪在调试模式下不会发生的问题),您仍然可以在发布模式下调用它。

【讨论】:

是的,但我必须在任何地方添加这个......这是很多代码:) @vsync:查找和替换是您的朋友。找到“console.log”,替换为“DEBUG && console.log”。但是,如果启用了调试(如 bjornd 的答案),则覆盖控制台,或者用您可以轻松覆盖/替换的方法替换对 console.log 的调用是一种更简洁的方法,需要更少或不需要现有代码编辑。 if (DEBUG) console.log("Foo."); 只长了两个字符,可读性更强。 const altConsole = ...console ; console.log = (...data) =&gt; !environment.production &amp;&amp; altConsole.log(...data); @shrys,那是什么?!!!

以上是关于不调试时如何禁用 console.log? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

尝试查看输出时如何使用 console.log? [复制]

在使用jQuery的时候js调试console.info()等等指令无效

如何快速方便地禁用我的代码中的所有 console.log 语句?

console.log 格式化输出

如何实现监听 console.log

将函数写入console.log,如何传递多个值? [复制]