2011-09-21 20 views
42

Ho molti console.log (o qualsiasi altra console chiamate) nel mio codice e vorrei usarli solo quando la mia app è in una sorta di "debug mode".Come disabilitare console.log quando non eseguo il debug?

Non riesco a utilizzare una qualche funzione di logger e uso internamente console.log perché non saprei quale linea lo ha generato. Forse solo con un try/catch, ma i miei log sono molto generali e non voglio provare/prendere il mio codice.

Cosa raccomanderesti?

+4

Il codice di produzione non deve essere registrato sulla console. – Incognito

+2

s/console \ .log \\ (. + \\) // g –

+2

possibile duplicato di [Override console.log(); per la produzione] (http://stackoverflow.com/questions/7042611/override-console-log-for-production) – user113716

risposta

12

Oggigiorno, nel 2014, ho semplicemente utilizzare GULP (e consigliamo a tutti di, è uno strumento incredibile), e ho un pacchetto installato, che si chiama stripDebug che fa quello per te.

(Io uso anche uglify e closureCompiler in produzione)

+3

Nessuno utilizzerà l'intero nuovo sistema di costruzione ** solo ** per gestire il problema "console.log in produzione". – bjornd

+1

true, ma un sito Web che non utilizza alcun task manager come GULP o GRUNT è probabilmente molto indietro rispetto alle best practice per lo sviluppo web. Voglio incoraggiare le persone a sviluppare per il web nel modo giusto, e credo davvero che senza il compito il corridore sarà sicuramente più lento da mantenere. – vsync

+1

puoi anche eseguire un NPM che fa semplicemente questo per te se rifiuti di usare GRUNT o GULP ... – vsync

38

Basta sostituire console.log con una funzione vuota per la produzione.

if (!DEBUG_MODE_ON) { 
    console = console || {}; 
    console.log = function(){}; 
} 
+7

Questo è un hack. Il tuo spreco di calcoli in produzione – Raynos

+1

@Raynos: SO sta facendo altrettanto. http://cdn.sstatic.net/js/stub.js Guarda la funzione vuota 'StackExchange.debug.log'. Sono d'accordo che è un hack, però. – pimvdb

+0

@pimvdb "La grande azienda X sta sbagliando, questo significa che posso sbagliare" – Raynos

43

avrei probabilmente abusare del short-circuiting natura di logical AND operator JavaScript e le istanze del:

console.log("Foo."); 

Con:

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

Supponendo DEBUG è una variabile globale che restituisce true se il debug è abilitato.

Questa strategia evita la sterilizzazione dello console.log(), quindi è ancora possibile chiamarlo in modalità di rilascio se davvero necessario (ad esempio per rintracciare un problema che non si verifica in modalità di debug).

+0

+1 per un semplice cortocircuito –

+0

sì, ma dovrò aggiungere questo ovunque ... è un sacco di codice :) – vsync

+0

@vsync: Trova e sostituisci è tuo amico. Trova "console.log", sostituisci con "DEBUG && console.log". Ma sovrascrivi la console se il debug è abilitato (come nella risposta di bjornd), o sostituisce le chiamate alla console.accedere con un metodo che è possibile sovrascrivere/sostituire facilmente è un metodo più ordinato che richiede meno o nessuna modifica del codice esistente. – fwielstra

23

Le funzioni globali di clobbering sono generalmente una cattiva idea.

Invece, è possibile sostituire tutte le istanze di console.log nel codice con LOG, e all'inizio del codice:

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

Questo sarà ancora mostrare i numeri di riga corretto e preservare anche la console.log funzione prevista per il terzo roba di gruppo, se necessario.

+0

Mi piace questo approccio! anche se in realtà non l'ho mai visto prima – vsync

+0

È possibile evitare di inquinare lo spazio dei nomi globale aggiungendo tale funzione di registro allo spazio dei nomi del proprio sito. Ad esempio 'myNamespace.log = myNamespace.DEBUG? console.log: function() {}; '. –

+0

Oppure usa LOG in un'unica chiusura che contiene il codice del tuo sito ... – namuol

2

Semplice.

Aggiungi un piccolo script bash che trova tutti i riferimenti a console.log e li elimina.

Assicurarsi che questo script batch venga eseguito come parte della distribuzione in produzione.

Non spellare console.log come una funzione vuota, è uno spreco di calcolo e spazio.

+10

Analisi di JavaScript con file batch? Bello scherzo! –

+0

@ OlegV.Volkov 'awk'. Problema risolto. – Raynos

+1

Ah ah ah ......! – fabspro

0

Questo codice funziona per me:

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

più Un modo per disabilitare console.log nella produzione e tenerlo in fase di sviluppo.

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

È possibile modificare le impostazioni di sviluppo come localhost e porta.

0

enter image description here

Le versioni più recenti di cromata che riga di codice nel quale file sparato console.log. Se stai cercando un sistema di gestione dei registri, puoi provare logeek che ti permette di controllare quali gruppi di registri vuoi vedere.

0
// 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"); 
+0

non può gestire i log come 'console.log (logMessage1, log2, log3, ...)' – BMW

0

Questa sostituzione involucro piccolo sarà avvolgere il metodo originale console.log con una funzione che ha un controllo al suo interno, che è possibile controllare dall'esterno, approfondendo se volete vedere i resoconti della console e non.

Ho scelto window.allowConsole come bandiera di esempio ma nella vita reale sarebbe probabilmente qualcos'altro. a seconda del tuo quadro.

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

Usage:

// 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}); 

Questa esclusione dovrebbe essere implementare come "alto" il più possibile nella gerarchia codice in modo che sarebbe "catturare" tutti i registri prima di allora accadere. Questo potrebbe essere esteso a tutti gli altri metodi console come warn, time, dir e così via.

Problemi correlati