วิธีปิดใช้งานงบ console.log ทั้งหมดในรหัสของฉันอย่างรวดเร็วและสะดวกสบาย?


256

มีวิธีใดบ้างที่จะปิดconsole.logข้อความทั้งหมดในรหัส JavaScript ของฉันเพื่อการทดสอบ?


11
ใช้เท็กซ์เอดิเตอร์ที่รองรับ "replace all" และแทนที่ "console.log" ด้วย "//console.log"
helloandre

5
@helloandre - ที่ได้รับน่าเบื่อเล็กน้อยแม้ว่าถ้าคุณใช้บันทึกข้อมูลเตือนการแก้ไขข้อผิดพลาดและข้อผิดพลาด
UpTheCreek

หวังว่าเราจะไปถึงจุดที่การใช้งานเบราว์เซอร์โดยอัตโนมัติข้ามคำสั่งคอนโซลโดยอัตโนมัติเว้นแต่เครื่องมือการดีบักของเบราว์เซอร์ถูกเปิดใช้งาน
faintsignal

2
คำตอบด้านล่างนั้นยอดเยี่ยม แต่คุณไม่จำเป็นต้องบูรณาการล้อกับสิ่งนี้ มีลักษณะที่picolog มันมี API ที่เข้ากันได้กับคอนโซล (ของ NodeJS) ดังนั้นคุณสามารถใช้มันแทนการดรอปดาวน์ มันสนับสนุนระดับการเข้าสู่ระบบออกจากกล่องที่ทำงานในเบราว์เซอร์บน NodeJS และ Nashorn สามารถกำหนดค่าได้อย่างง่ายดายจากสตริงการสืบค้น (เบราว์เซอร์) หรือตัวแปรสภาพแวดล้อมPICOLOG_LEVEL(โหนด) และก็ซุปเปอร์เล็ก ๆ น้อยกว่า 900 ไบต์ย่อและบีบอัด ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียน
Stijn de Witt

มีวิธีง่ายๆในการแทนที่consoleฟังก์ชั่นทั้งหมด เพียงแค่ดูที่stapp.space/disable-javascript-console-on-production
Piotr Stapp

คำตอบ:


426

กำหนดฟังก์ชัน console.log ในสคริปต์ของคุณอีกครั้ง

console.log = function() {}

แค่นั้นไม่มีข้อความให้ปลอบใจอีกแล้ว

แก้ไข:

ขยายความคิดของ Cide ตัวบันทึกที่กำหนดเองซึ่งคุณสามารถใช้เพื่อสลับการเปิด / ปิดการบันทึกจากรหัสของคุณ

จากคอนโซล Firefox ของฉัน:

var logger = function()
{
    var oldConsoleLog = null;
    var pub = {};

    pub.enableLogger =  function enableLogger() 
                        {
                            if(oldConsoleLog == null)
                                return;

                            window['console']['log'] = oldConsoleLog;
                        };

    pub.disableLogger = function disableLogger()
                        {
                            oldConsoleLog = console.log;
                            window['console']['log'] = function() {};
                        };

    return pub;
}();

$(document).ready(
    function()
    {
        console.log('hello');

        logger.disableLogger();
        console.log('hi', 'hiya');
        console.log('this wont show up in console');

        logger.enableLogger();
        console.log('This will show up!');
    }
 );

วิธีการใช้งาน 'คนตัดไม้' ด้านบน? ในเหตุการณ์ที่พร้อมของคุณโทร logger.disableLogger เพื่อให้ข้อความคอนโซลไม่ถูกบันทึก เพิ่มการเรียกไปยัง logger.enableLogger และ logger.disableLogger ภายในวิธีการที่คุณต้องการบันทึกข้อความไปยังคอนโซล


โปรดระบุรายละเอียดเกี่ยวกับสิ่งที่ใช้ไม่ได้ บรรทัดข้างต้นมีข้อผิดพลาดหรือไม่? ถ้าใช่ข้อความแสดงข้อผิดพลาดคืออะไร
SolutionYogi

1
ได้ผลสำหรับฉันใน IE8 ;-)
Eugene Lazutkin

รหัสเขียนทับและคืนค่าฟังก์ชัน console.log หาก IE7 รองรับวิธี console.log ก็ควรใช้งานได้
SolutionYogi

3
console.log = function () {} ดูเหมือนจะไม่ทำงานใน Firefox คุณยังคงได้รับข้อผิดพลาด 'ไม่ได้กำหนดคอนโซล'
ดา

2
ช่างเป็นทางออกที่น่ากลัว การปรับเปลี่ยนconsole.log... ทำไมไม่เพียงแค่มีบูลีนและฟังก์ชั่นที่มีเงื่อนไขสำหรับการบันทึกข้อมูล
Dementic

76

ต่อไปนี้คือละเอียดเพิ่มเติม:

var DEBUG = false;
if(!DEBUG){
    if(!window.console) window.console = {};
    var methods = ["log", "debug", "warn", "info"];
    for(var i=0;i<methods.length;i++){
        console[methods[i]] = function(){};
    }
}

สิ่งนี้จะทำให้วิธีการทั่วไปในคอนโซลเป็นศูนย์ถ้ามีอยู่และสามารถเรียกใช้ได้โดยไม่มีข้อผิดพลาดและแทบไม่มีประสิทธิภาพเหนือหัว ในกรณีของเบราว์เซอร์เช่น IE6 ที่ไม่มีคอนโซลวิธีการจำลองจะถูกสร้างขึ้นเพื่อป้องกันข้อผิดพลาด แน่นอนว่ามีฟังก์ชั่นอื่น ๆ อีกมากมายใน Firebug เช่นการติดตามโปรไฟล์เวลา ฯลฯ พวกเขาสามารถเพิ่มลงในรายการหากคุณใช้พวกเขาในรหัสของคุณ

นอกจากนี้คุณยังสามารถตรวจสอบว่าโปรแกรมดีบั๊กมีวิธีพิเศษเหล่านั้นหรือไม่ (เช่น IE) และไม่มีวิธีที่ไม่สนับสนุน:

if(window.console && !console.dir){
var methods = ["dir", "dirxml", "trace", "profile"]; //etc etc
    for(var i=0;i<methods.length;i++){
        console[methods[i]] = function(){};
    }
}

สิ่งนี้ใช้ได้กับฉันอย่างสมบูรณ์แบบแม้ว่าฉันจะบิดมันนิดหน่อยฉันก็ตรวจสอบสภาพแวดล้อม (ฉันแค่ต้องการให้มันปิดการใช้งานในการผลิต)
Muganwas

27

เท่าที่ฉันสามารถบอกได้จากเอกสารประกอบ Firebug ไม่ได้ให้ตัวแปรใด ๆ ในการสลับสถานะการดีบัก ให้ตัดคำสั่ง console.log () ใน wrapper แทนตามเงื่อนไขเช่น:

DEBUG = true; // set to false to disable debugging
function debug_log() {
    if ( DEBUG ) {
        console.log.apply(this, arguments);
    }
}

หากไม่ต้องการเปลี่ยนการโทรที่มีอยู่ทั้งหมดคุณสามารถใช้สิ่งนี้แทน:

DEBUG = true; // set to false to disable debugging
old_console_log = console.log;
console.log = function() {
    if ( DEBUG ) {
        old_console_log.apply(this, arguments);
    }
}

1
ขอบคุณแม้ว่านี่หมายความว่าฉันต้องเขียนคำสั่ง console.log ทั้งหมดของฉันเป็น debug.log
Zack Burt

นี่เป็นวิธีที่ถูกต้องที่จะทำ - แน่นอนถ้าคุณเริ่มจากศูนย์
OpenSource

3
นอกจากนี้ยังเป็นวิธีที่ถูกต้องหากคุณมีฟังก์ชั่น find / replace ที่ดีในตัวแก้ไขของคุณ
BaroqueBobcat

2
ไม่จำเป็นต้องเขียน wrapper ของคุณเอง btw อย่างน้อยถ้าคุณใช้ jQuery ปลั๊กอินการดีบัก jQuery ใช้งานได้ดี เป็นโบนัสมันให้การจำลองของ console.log บนเบราว์เซอร์โดยไม่ได้ trainofthoughts.org/blog/2007/03/16/jquery-plugin-debug
Nelson

แน่นอน [ปัญหาเล็กน้อย] ที่คุณต้องติดตั้งปลั๊กอิน :) ดีที่จะรู้ - ขอบคุณ!
Cide

17

ที่คุณไม่ควร!

ไม่ใช่วิธีที่ดีในการเขียนทับฟังก์ชั่นในตัว นอกจากนี้ยังไม่มีการรับประกันว่าคุณจะระงับเอาต์พุตทั้งหมดไลบรารีอื่น ๆ ที่คุณใช้อาจยกเลิกการเปลี่ยนแปลงของคุณและมีฟังก์ชั่นอื่น ๆ ที่อาจเขียนลงในคอนโซล .dir(), .warning(), .error(), .debug(),.assert()ฯลฯ

ตามที่แนะนำบางอย่างคุณสามารถกำหนดDEBUG_MODEตัวแปรและบันทึกตามเงื่อนไข ขึ้นอยู่กับความซับซ้อนและลักษณะของรหัสของคุณอาจเป็นความคิดที่ดีที่จะเขียนวัตถุ / ฟังก์ชันตัวบันทึกของคุณเองที่ล้อมรอบวัตถุคอนโซลและมีความสามารถในตัวนี้ นั่นจะเป็นสถานที่ที่เหมาะสมในการจัดการกับเครื่องมือวัด

ที่กล่าวไว้สำหรับวัตถุประสงค์ 'การทดสอบ' คุณสามารถเขียนการทดสอบแทนการพิมพ์ไปยังคอนโซล ถ้าคุณไม่ได้ทำการทดสอบใด ๆ และผู้ที่console.log()เส้นเป็นเพียงตัวช่วยในการเขียนรหัสของคุณเพียงแค่ลบพวกเขา


7
"other libraries you use may revert your changes": ถ้าฉันปิดการใช้งานconsole.logเมื่อเริ่มต้นพวกเขาไม่สามารถเปลี่ยนกลับไปใช้ฟังก์ชั่นเก่าได้ พวกเขาสามารถเขียนconsole.logซอร์สโค้ดได้ แต่ทำไม "it may be a good idea to write your own logger object/function that wraps around the console object": ฉันเคยทำมาแล้วและมันก็เป็นความคิดที่ไม่ดี การติดตามของเอาต์พุตคอนโซลหมายถึง wrapper และไม่ใช่กับบรรทัดที่เรียกใช้ทำให้การดีบักยากขึ้น
Marco Sulla

3
@LucasMalor "ตอนเริ่มต้น" หมายถึงรหัสนั้นควบคู่ไปกับโครงสร้างพื้นฐานที่ จำกัด การใช้ซ้ำได้ เป็นการยากที่จะวางนัยทั่วไป เกมภาพเคลื่อนไหว DOM บางอย่างไม่เหมือนกับตรรกะโดเมนภายใน SPA ที่ซับซ้อนหลังจากนั้นไม่ควรตระหนักถึงเบราว์เซอร์ แต่เพียงผู้เดียวที่รู้สิ่งที่เรียกว่า "คอนโซล" ในกรณีนี้คุณควรมีกลยุทธ์การทดสอบที่เหมาะสมแทนการแฮ็คบางอย่างconsole.log('Look ma, it reaches this point');ในรหัสของคุณเมื่อทุกอย่างล้มเหลวคุณสามารถใช้debugger;คำแนะนำได้
istepaniuk

"the code is coupled to that infrastructure": รหัสอาจ แต่รูปแบบไม่ หากคุณสร้างเทมเพลตพื้นฐานทั่วไปสำหรับเพจของคุณที่ปิดใช้งานฟังก์ชั่นการบันทึกมันเป็นตรรกะที่คุณสามารถนำไปใช้ได้ทุกที่ "the later shouldn't be browser-aware": ดีดังนั้นคุณไม่ควรใช้ JS: P
Marco Sulla

3
@MarcoSulla ฉันคิดว่าเขาเริ่มเขียนโค้ดที่สะอาดกว่า การพูดว่า "... คุณไม่ควรใช้ JS" เป็นเรื่องถนัดมือ ในฐานะที่เป็นโปรแกรมเมอร์ไม่ว่าสภาพแวดล้อมของคุณคืออะไรคุณควรทำให้เป็นโมดูลมากที่สุด ถ้ามันไม่สนใจเกี่ยวกับเบราว์เซอร์คุณสามารถปรับใช้มันในที่อื่น ๆ นั่นคือการพึ่งพาได้น้อยลงที่จะต้องกังวลเกี่ยวกับการแบ่งเนื้อหาของคุณ IMHO ใช่แล้วเขาพูดถูกจริงๆ โปรดทราบว่าคุณเริ่มต้นด้วยการพูดว่า "หากคุณสร้างเทมเพลตพื้นฐานทั่วไป ... " ซึ่งในตัวมันเองนั้นจะแนะนำการพึ่งพา การคิดแบบนี้เป็นสิ่งที่ทำให้ซอฟต์แวร์ซับซ้อน อาหารสมอง.
dudewad

1
Adobe SiteCatalyics พ่นขยะจำนวนมากในคอนโซลของฉันและสร้างความยุ่งยากในการดีบั๊กในบางกรณี ดังนั้นความสามารถในการปิดการใช้งานชั่วคราว console.log เมื่อผมดำเนินการเรียกบุคคลที่สามจะเป็นประโยชน์สวยสำหรับฉัน
Spinn

16

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ก็ยังปรากฏขึ้นที่ด้านบนของผลลัพธ์ของ Google ดังนั้นนี่เป็นโซลูชันที่ไม่ใช่ jQuery ที่สง่างามกว่าที่ใช้งานได้กับ Chrome, FF และ IE ล่าสุด

(function (original) {
    console.enableLogging = function () {
        console.log = original;
    };
    console.disableLogging = function () {
        console.log = function () {};
    };
})(console.log);

12

ฉันรู้ว่าคุณถามวิธีปิดการใช้งาน console.log แต่นี่อาจเป็นสิ่งที่คุณต้องการจริงๆ วิธีนี้คุณไม่ต้องเปิดหรือปิดการใช้งานคอนโซลอย่างชัดเจน มันป้องกันข้อผิดพลาดของคอนโซลที่น่ารำคาญสำหรับผู้ที่ไม่ได้เปิดหรือติดตั้ง

if(typeof(console) === 'undefined') {
    var console = {};
    console.log = console.error = console.info = console.debug = console.warn = console.trace = console.dir = console.dirxml = console.group = console.groupEnd = console.time = console.timeEnd = console.assert = console.profile = function() {};
}

2
สำหรับการปิดใช้งานการบันทึกเฉพาะ IE ดูคำตอบ Chris S.
GuruM

11

เพียงเปลี่ยนค่าสถานะDEBUGเพื่อแทนที่ฟังก์ชัน console.log สิ่งนี้ควรทำเคล็ดลับ

var DEBUG = false;
// ENABLE/DISABLE Console Logs
if(!DEBUG){
  console.log = function() {}
}

2
ฉันจะไปอีกขั้นหนึ่งแล้วห่อมันในฟังก์ชันตัวบันทึก / คลาส บางสิ่งเช่นนี้:function myLog(msg) { if (debug) { console.log(msg); } }
sleblanc

หากใช้ Angular คุณสามารถใช้เป็นการกำหนดค่าโกลบอลในไฟล์ application.js ของคุณและใช้เป็นคุณสมบัติโกลบอลเพื่อเปิด / ปิดบันทึก จำไว้ว่าคอนโซลจะไม่ถูกกำหนดถ้าคุณเปิดแถบเครื่องมือผู้พัฒนาใน IE
Swanidhi

10

ฉันประหลาดใจที่คำตอบทั้งหมดนั้นไม่มีใครรวม:

  • ไม่มี jquery
  • ฟังก์ชั่นไม่ระบุชื่อเพื่อไม่สร้างมลภาวะเนมสเปซส่วนกลาง
  • จัดการกับกรณีที่หน้าต่างไม่ได้กำหนดพื้นรองเท้า
  • เพียงปรับเปลี่ยนฟังก์ชั่น. log ของคอนโซล

ฉันจะไปที่นี้:

(function () {

    var debug = false

    if (debug === false) {
        if ( typeof(window.console) === 'undefined') { window.console = {}; }
        window.console.log = function () {};
    }
})()

9

หลังจากที่ฉันค้นหาปัญหานี้แล้วและลองในแอพคอร์โดวาของฉันฉันแค่ต้องการเตือนนักพัฒนาทุกคนสำหรับโทรศัพท์ windows ที่จะไม่เขียนทับ

    console.log

เพราะแอพจะมีปัญหาเมื่อเริ่มต้น

มันจะไม่พังถ้าคุณพัฒนาในท้องที่หากคุณโชคดี แต่การส่งในร้านจะทำให้แอปหยุดทำงาน

เพียงแค่เขียนทับ

    window.console.log 

ถ้าคุณต้องการ

สิ่งนี้ใช้ได้ในแอพของฉัน:

   try {
        if (typeof(window.console) != "undefined") {
            window.console = {};
            window.console.log = function () {
            };
            window.console.info = function () {
            };
            window.console.warn = function () {
            };
            window.console.error = function () {
            };
        }

        if (typeof(alert) !== "undefined") {
            alert = function ()
            {

            }
        }

    } catch (ex) {

    }

ขอบคุณสำหรับ "คำเตือน" อย่างไรก็ตามฉันมีแอพที่ใช้คอร์โดวาของฉันเปิดตัวในร้านค้า GooglePlay ทดสอบด้วยอุปกรณ์โทรศัพท์และทุกอย่างเรียบร้อยดี ฉันอาจสันนิษฐานว่าคำเตือนของคุณถูก จำกัด ไว้ที่ app store "based windows"? ... อย่างไรก็ตามมันเป็นการดีที่จะแนะนำให้ใส่ ops ไว้ในวงเล็บลองในกรณีที่มันระเบิด ดังนั้นยกนิ้วให้
Panini Luncher

8

หากคุณใช้ IE7 คอนโซลจะไม่ถูกกำหนด ดังนั้นเวอร์ชันที่เป็นมิตรของ IE ก็จะเป็น:

if (typeof console == "undefined" || typeof console.log == "undefined") 
{
   var console = { log: function() {} }; 
}

5

ไฮบริดของคำตอบจากSolutionYogiและChris S.มันเก็บรักษาหมายเลขบรรทัด console.log และชื่อไฟล์ ตัวอย่าง jsFiddle

// Avoid global functions via a self calling anonymous one (uses jQuery)
(function(MYAPP, $, undefined) {
    // Prevent errors in browsers without console.log
    if (!window.console) window.console = {};
    if (!window.console.log) window.console.log = function(){};

    //Private var
    var console_log = console.log;  

    //Public methods
    MYAPP.enableLog = function enableLogger() { console.log = console_log; };   
    MYAPP.disableLog = function disableLogger() { console.log = function() {}; };

}(window.MYAPP = window.MYAPP || {}, jQuery));


// Example Usage:
$(function() {    
    MYAPP.disableLog();    
    console.log('this should not show');

    MYAPP.enableLog();
    console.log('This will show');
});


3

ฉันใช้สิ่งต่อไปนี้เพื่อจัดการกับปัญหาของเขา: -

var debug = 1;
var logger = function(a,b){ if ( debug == 1 ) console.log(a, b || "");};

ตั้งค่าการดีบักเป็น 1 เพื่อเปิดใช้งานการดีบัก จากนั้นใช้ฟังก์ชันตัวบันทึกเมื่อแสดงข้อความดีบั๊ก นอกจากนี้ยังตั้งค่าให้รับพารามิเตอร์สองตัว

ดังนั้นแทนที่จะ

console.log("my","log");

ใช้

logger("my","log");

3

ฉันใช้วินสตันแล้ว logger มาก่อน

ทุกวันนี้ฉันใช้โค้ดด้านล่างที่ง่ายกว่าจากประสบการณ์:

  1. ตั้งค่าตัวแปรสภาพแวดล้อมจาก cmd / บรรทัดคำสั่ง (บน Windows):

    cmd
    setx LOG_LEVEL info

หรือคุณอาจมีตัวแปรในรหัสของคุณหากคุณต้องการ แต่ข้างบนจะดีกว่า

  1. รีสตาร์ท cmd / บรรทัดคำสั่งหรือ IDE / ตัวแก้ไขเช่น Netbeans

  2. มีรหัสด้านล่างเช่น:

    console.debug = console.log;   // define debug function
    console.silly = console.log;   // define silly function
    
    switch (process.env.LOG_LEVEL) {
        case 'debug':
        case 'silly':
            // print everything
            break;
    
        case 'dir':
        case 'log':
            console.debug = function () {};
            console.silly = function () {};
            break;
    
        case 'info':
            console.debug = function () {};
            console.silly = function () {};
            console.dir = function () {};
            console.log = function () {};
            break;
    
        case 'trace':   // similar to error, both may print stack trace/ frames
        case 'warn':    // since warn() function is an alias for error()
        case 'error':
            console.debug = function () {};
            console.silly = function () {};
            console.dir = function () {};
            console.log = function () {};
            console.info = function () {};
            break;
    }
  3. ตอนนี้ใช้ console ทั้งหมด * ดังนี้:

    console.error(' this is a error message '); // will print
    console.warn(' this is a warn message '); // will print
    console.trace(' this is a trace message '); // will print
    console.info(' this is a info message '); // will print, LOG_LEVEL is set to this
    
    console.log(' this is a log message '); // will NOT print
    console.dir(' this is a dir message '); // will NOT print
    console.silly(' this is a silly message '); // will NOT print
    console.debug(' this is a debug message '); // will NOT print

ตอนนี้ขึ้นอยู่กับการตั้งค่า LOG_LEVEL ของคุณที่ทำในจุดที่ 1 (เช่น setx LOG_LEVEL logและเริ่มต้นบรรทัดคำสั่ง) สิ่งที่กล่าวมาข้างต้นบางอย่างจะพิมพ์คนอื่นจะไม่พิมพ์

หวังว่าจะช่วย


2

คำเตือน: ปลั๊กไร้ยางอาย!

คุณสามารถใช้บางอย่างเช่นวัตถุ JsTrace ของฉันเพื่อติดตามแบบแยกส่วนพร้อมความสามารถในการ "สลับ" ระดับโมดูลเพื่อเปิดสิ่งที่คุณต้องการดูในเวลานั้นเท่านั้น

http://jstrace.codeplex.com

(นอกจากนี้ยังมีแพ็คเกจ NuGet สำหรับผู้ที่สนใจ)

ทุกระดับเริ่มต้นที่ "ผิดพลาด" แม้ว่าคุณจะสามารถปิดได้ "ปิด" แม้ว่าฉันจะนึกไม่ออกว่าทำไมคุณถึงไม่อยากเห็นข้อผิดพลาด

คุณสามารถเปลี่ยนพวกเขาเช่นนี้:

Trace.traceLevel('ModuleName1', Trace.Levels.log);
Trace.traceLevel('ModuleName2', Trace.Levels.info);

ดูเอกสารเพิ่มเติมก่อนดูเอกสาร

T


2

ฉันพบโค้ดขั้นสูงเล็กน้อยใน URL นี้คำแนะนำ JavaScript: Bust and Disable console.log :

var DEBUG_MODE = true; // Set this value to false for production

if(typeof(console) === 'undefined') {
   console = {}
}

if(!DEBUG_MODE || typeof(console.log) === 'undefined') {
   // FYI: Firebug might get cranky...
   console.log = console.error = console.info = console.debug = console.warn = console.trace = console.dir = console.dirxml = console.group = console.groupEnd = console.time =    console.timeEnd = console.assert = console.profile = function() {};
}

2

ฉันพัฒนาห้องสมุดสำหรับ usecase นี้: https://github.com/sunnykgupta/jsLogger

คุณสมบัติ:

  1. มันจะแทนที่ console.log อย่างปลอดภัย
  2. ระวังถ้าคอนโซลไม่พร้อมใช้งาน (โอ้ใช่คุณต้องคำนึงถึงเรื่องนั้นด้วย)
  3. เก็บบันทึกทั้งหมด (แม้ว่าจะถูกระงับ) เพื่อเรียกคืนในภายหลัง
  4. ฟังก์ชั่นจับคอนโซลที่สำคัญชอบlog, warn, ,errorinfo

เปิดให้แก้ไขและจะได้รับการอัปเดตเมื่อมีคำแนะนำใหม่เกิดขึ้น


2

สิ่งนี้จะแทนที่เมธอดทั้งหมดของ window.console คุณสามารถวางไว้ที่ด้านบนสุดของส่วนสคริปต์ของคุณและถ้าคุณอยู่ในกรอบงาน PHP คุณสามารถพิมพ์รหัสนี้ได้เฉพาะเมื่อสภาพแวดล้อมแอปของคุณใช้งานได้หรือหากปิดใช้งานการตั้งค่าการดีบักบางประเภท จากนั้นคุณจะต้องมีบันทึกทั้งหมดของคุณในรหัสของคุณทำงานบนสภาพแวดล้อมการพัฒนาหรือในโหมดการแก้ปัญหา

window.console = (function(originalConsole){
    var api = {};
    var props = Object.keys(originalConsole);
    for (var i=0; i<props.length; i++) {
        api[props[i]] = function(){};
    }
    return api;
})(window.console);

1

ฉันเขียนสิ่งนี้:

//Make a copy of the old console.
var oldConsole = Object.assign({}, console);

//This function redefine the caller with the original one. (well, at least i expect this to work in chrome, not tested in others)
function setEnabled(bool) {
    if (bool) {
        //Rewrites the disable function with the original one.
        console[this.name] = oldConsole[this.name];
        //Make sure the setEnable will be callable from original one.
        console[this.name].setEnabled = setEnabled;
    } else {
        //Rewrites the original.
        var fn = function () {/*function disabled, to enable call console.fn.setEnabled(true)*/};
        //Defines the name, to remember.
        Object.defineProperty(fn, "name", {value: this.name});
        //replace the original with the empty one.
        console[this.name] = fn;
        //set the enable function
        console[this.name].setEnabled = setEnabled

    }
}

น่าเสียดายที่มันใช้งานไม่ได้กับโหมดเข้มงวด

ดังนั้นการใช้console.fn.setEnabled = setEnabledแล้วconsole.fn.setEnabled(false)ที่fnอาจจะเกือบทุกฟังก์ชั่นคอนโซล สำหรับกรณีของคุณจะเป็น:

console.log.setEnabled = setEnabled;
console.log.setEnabled(false);

ฉันเขียนสิ่งนี้ด้วย:

var FLAGS = {};
    FLAGS.DEBUG = true;
    FLAGS.INFO = false;
    FLAGS.LOG = false;
    //Adding dir, table, or other would put the setEnabled on the respective console functions.

function makeThemSwitchable(opt) {
    var keysArr = Object.keys(opt);
    //its better use this type of for.
    for (var x = 0; x < keysArr.length; x++) {
        var key = keysArr[x];
        var lowerKey = key.toLowerCase();
        //Only if the key exists
        if (console[lowerKey]) {
            //define the function
            console[lowerKey].setEnabled = setEnabled;
            //Make it enabled/disabled by key.
            console[lowerKey].setEnabled(opt[key]);
        }
    }
}
//Put the set enabled function on the original console using the defined flags and set them.
makeThemSwitchable(FLAGS);

ดังนั้นคุณเพียงแค่ต้องใส่FLAGSค่าเริ่มต้น (ก่อนที่จะรันโค้ดด้านบน) เช่นFLAGS.LOG = falseและฟังก์ชั่นการบันทึกจะถูกปิดการใช้งานโดยค่าเริ่มต้นและยังคงคุณสามารถเปิดใช้งานมันโทรconsole.log.setEnabled(true)


คุณคิดว่าสิ่งนี้สามารถใช้เพื่อเปิดใช้งาน console.log ในสภาพแวดล้อมการผลิตได้ทันทีหรือไม่ เช่นคอนโซลเปิดของ Chrome เรียกใช้console.log.setEnabled(true)และเริ่มดูบันทึก
Rodrigo Assis

1
@RodrigoAssis ใช่มันจะทำงานได้ ฉันได้สร้างสิ่งนี้ขึ้นเพื่อไม่ให้สายผู้โทรหายและเปิดใช้งานได้ทุกที่ แต่นี่ไม่ใช่วิธีที่ดีที่สุด วิธีที่ดีที่สุดสำหรับบันทึกใช้วิธีลัดวงจรเช่น: var debug = false; debug && console.log(1/3)เนื่องจากคุณไม่จำเป็นต้องประเมินเนื้อหาบันทึกหากไม่ได้เปิดใช้งาน (ในกรณีนี้1/3จะไม่ได้รับการประเมิน) ไม่ต้องเสียสายผู้โทรและสามารถเปิดใช้งานได้ มันก็ง่ายเหมือนกัน (ถ้าไม่ vars เป็น const)
Gabriel De Oliveira Rohden

1

โซลูชันที่ครอบคลุมของฉันในการปิดใช้งาน / แทนที่console.*ฟังก์ชั่นทั้งหมดอยู่ที่นี่ที่นี่

แน่นอนโปรดตรวจสอบให้แน่ใจว่าคุณได้รวมไว้หลังจากตรวจสอบบริบทที่จำเป็น ตัวอย่างเช่นเฉพาะในรุ่นที่ผลิตเท่านั้นจะไม่ระเบิดส่วนประกอบสำคัญอื่น ๆ เป็นต้น

ยกมาที่นี่:

"use strict";
(() => {
  var console = (window.console = window.console || {});
  [
    "assert", "clear", "count", "debug", "dir", "dirxml",
    "error", "exception", "group", "groupCollapsed", "groupEnd",
    "info", "log", "markTimeline", "profile", "profileEnd", "table",
    "time", "timeEnd", "timeStamp", "trace", "warn"
  ].forEach(method => {
    console[method] = () => {};
  });
  console.log("This message shouldn't be visible in console log");
})();


1

หากคุณใช้อึกคุณสามารถใช้ปลั๊กอินนี้ :

ติดตั้งปลั๊กอินนี้ด้วยคำสั่ง:

npm install gulp-remove-logging

ถัดไปเพิ่มบรรทัดนี้ใน gulpfile ของคุณ:

var gulp_remove_logging = require("gulp-remove-logging");

สุดท้ายเพิ่มการตั้งค่าการกำหนดค่า (ดูด้านล่าง) ใน gulpfile ของคุณ

การกำหนดค่างาน

gulp.task("remove_logging", function() {
     return gulp.src("src/javascripts/**/*.js")
    .pipe(
      gulp_remove_logging()
    )
    .pipe(
      gulp.dest(
        "build/javascripts/"
      )
    ); });


0

คุณสามารถใช้ javascript AOP (เช่นjquery-aop ) เพื่อสกัดกั้นการโทรทั้งหมดไปยัง console.debug / log (รอบ ๆ ) และไม่ดำเนินการกับการเรียกใช้จริงหากตัวแปรโกลบอลบางตัวถูกตั้งค่าเป็นเท็จ

คุณยังสามารถทำการโทร ajax (ตอนนี้จากนั้น) เพื่อให้คุณสามารถเปลี่ยนพฤติกรรมการเปิดใช้งาน / ปิดใช้งานการบันทึกบนเซิร์ฟเวอร์ซึ่งน่าสนใจมากในการเปิดใช้งานการดีบักเมื่อเผชิญกับปัญหาในสภาพแวดล้อมการจัดเตรียมหรือ


ฉันยังไม่ได้ใช้โซลูชันดังกล่าว แต่ไม่ได้เห็น ในทางทฤษฎีแล้ว
Stijn Geukens

0

คุณสามารถใช้logeekช่วยให้คุณสามารถควบคุมการมองเห็นข้อความบันทึกของคุณ นี่คือวิธีที่คุณทำ:

<script src="bower_components/dist/logeek.js"></script>

logeek.show('security');

logeek('some message').at('copy');       //this won't be logged
logeek('other message').at('secturity'); //this would be logged

คุณสามารถlogeek.show('nothing')ปิดการใช้งานข้อความบันทึกทั้งหมดได้โดยสิ้นเชิง


0

หลังจากทำการวิจัยและพัฒนาสำหรับปัญหานี้ฉันพบวิธีนี้ซึ่งจะซ่อนคำเตือน / ข้อผิดพลาด / บันทึกตามที่คุณเลือก

    (function () {
    var origOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function () {        
        console.warn = function () { };
        window['console']['warn'] = function () { };
        this.addEventListener('load', function () {                        
            console.warn('Something bad happened.');
            window['console']['warn'] = function () { };
        });        
    };
})();

เพิ่มรหัสนี้ก่อนปลั๊กอิน JQuery (เช่น /../jquery.min.js) แม้ว่าจะเป็นรหัส JavaScript ที่ไม่ต้องการ JQuery เพราะคำเตือนบางอย่างอยู่ใน JQuery เอง

ขอบคุณ !!


0

ฉันเขียนโซลูชันES2015 (ใช้เฉพาะกับWebpack )

class logger {
  static isEnabled = true;

  static enable () {
    if(this.constructor.isEnabled === true){ return; }

    this.constructor.isEnabled = true;
  }

  static disable () {
    if(this.constructor.isEnabled === false){ return; }

    this.constructor.isEnabled = false;
  }

  static log () {
    if(this.constructor.isEnabled === false ) { return; }

    const copy = [].slice.call(arguments);

    window['console']['log'].apply(this, copy);
  }

  static warn () {
    if(this.constructor.isEnabled === false ) { return; }

    const copy = [].slice.call(arguments);

    window['console']['warn'].apply(this, copy);
  }

  static error () {
    if(this.constructor.isEnabled === false ) { return; }

    const copy = [].slice.call(arguments);

    window['console']['error'].apply(this, copy);
  }
}

รายละเอียด:

  1. พร้อมกับ logger.enable และ logger.disable คุณสามารถใช้คอนโซลได้ ['log', 'warn', 'error'] วิธีการเช่นเดียวกันโดยใช้คลาส logger
  2. โดยการใช้คลาสตัวบันทึกสำหรับการแสดงการเปิดหรือปิดการใช้งานข้อความทำให้โค้ดนั้นสะอาดและสามารถบำรุงรักษาได้มาก
  3. รหัสด้านล่างแสดงวิธีใช้คลาสตัวบันทึก:
    • logger.disable() - ปิดการใช้งานข้อความคอนโซลทั้งหมด
    • logger.enable() - เปิดใช้งานข้อความคอนโซลทั้งหมด
    • logger.log('message1', 'message2') - ทำงานเหมือนกับ console.log
    • logger.warn('message1', 'message2') - ทำงานเหมือนกับ console.warn
    • logger.error('message1', 'message2')- ทำงานเหมือนกับ console.error การเข้ารหัสที่มีความสุข ..
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.