So aktivieren / deaktivieren Sie $ log.debug in AngularJS

77

Ich versuche $ log.debug ("Foo") zu verwenden. Wie kann es ausgeschaltet werden? Ich kann nirgendwo eine Probe finden. Ich denke, es muss in der Konfiguration eingestellt werden, aber ich kann das auch nicht zum Laufen bringen.

Wo setzt man den Ein- und Ausschalter?

Eric Rohlfs
quelle

Antworten:

137

$ logProvider.debugEnabled (true)

Dies ist nur in AngularJs 1.1.2 oder höher verfügbar.

https://github.com/angular/angular.js/pull/1625

Hier ist ein Beispiel dafür.

var app = angular.module('plunker', []);

app.config(function($logProvider){
  $logProvider.debugEnabled(true);
});

app.controller('MainCtrl', function($scope, $log ) {
  $scope.name = 'World';
  $scope.model = {value: "test"};
  $log.debug('TEST Log');
});

http://plnkr.co/edit/HZCAoS?p=preview

Standardmäßig ist es eingeschaltet.

rgaskill
quelle
2
Wo legen Sie $ logProvider.debugEnabled (true) ab?
Eric Rohlfs
Vielen Dank. Ich habe eine ältere Version von anglejs verwendet. Ich habe gerade den Protokollanbieter in der Datei angle.js in meiner App überschrieben.
Eric Rohlfs
3
$logProvider.debugEnabled(false);Deaktiviert man nun einfach die .debug()Methode und lässt sie .log(), .info(), etcaktiviert?
TrazeK
9
Was ist der Punkt dann? Ich gehe davon aus, dass sich Entwickler nicht nur darauf beschränken $log.debug. Sollte es im Anbieter keine Option geben, kann die gesamte $logDienstausgabe deaktiviert werden. Oder erlauben Sie anzugeben, was verlassen werden soll. Das wäre nützlich. Sicher, ich könnte meinen eigenen Service-Wrapper für den $logService schreiben und von dort aus damit umgehen ... irgendwie, aber was ist dann wieder der Sinn dieser Option?
Eugene
2
@ Eugene Ich stimme deinen Gedanken zu; Ich vermute, sie haben sich gedacht, Entwickler würden sich auf $ log.debug für die Nachrichten beschränken, die sie nur im "Debug / Development" -Modus ihres Projekts erhalten wollten, und Entwickler würden die anderen $ log-Typen nur für Fälle verwenden, in denen Sie dachten, es gäbe keinen wirklichen Grund, sie auszuschalten. Wenn Sie beispielsweise eine Bibliothek erstellen und Informationen, Warn- und Fehlermeldungen protokollieren, sehen Sie keinen Grund zur Unterdrückung, da diese Nachrichten Teil der in Ihrer Bibliothek enthaltenen Logik sind, um Ihren Benutzern die ordnungsgemäße Verwendung zu erleichtern.
StackOverflowUser
14

Sie können das Standardverhalten von $ log mit einem Dekorateur überschreiben, um die Protokollstufe zu verbessern. Dies ist ein Beispiel:

angular.module('app').config(function($logProvider, $provide){

    $logProvider.debugEnabled(false);

    $provide.decorator('$log', function ($delegate) {
        //Original methods
        var origInfo = $delegate.info;
        var origLog = $delegate.log;

        //Override the default behavior
        $delegate.info = function () {

            if ($logProvider.debugEnabled())
                origInfo.apply(null, arguments)
        };

        //Override the default behavior    
        $delegate.log = function () {

            if ($logProvider.debugEnabled())
                origLog.apply(null, arguments)
        };

        return $delegate;
    });
});

Dies wurde von der Arbeit von John Crosby unter http://www.thekuroko.com/using-angulars-log-provider/ inspiriert.

Diego
quelle
13

Ich habe das gleiche Problem, aber es ist kein Problem, das durch Codierung gelöst werden muss, sondern nur über die Browserkonsole aktiviert wird

Gehen Sie zur Konsole des Browsers und stellen Sie die Ebene auf ausführlich ein

Nitin
quelle
3
Ich musste dies tun, um $log.debugNachrichten in Chrome zu sehen.
ThisClark
Welches ist standardmäßig ausgeschaltet.
Commonpike
1

Basierend auf der Antwort von Diego, aber Hinzufügen einer Env-Konfiguration und Verkürzung. Sie können Ihre App einfach ausführen mit: NODE_ENV=developmentoderNODE_ENV=production

Eg1. NODE_ENV=development webpack-dev-server

Eg2. NODE_ENV=production node app.js

$logProvider.debugEnabled(process.env.NODE_ENV === 'development');
$provide.decorator('$log', function($delegate) {
    $delegate.info = $logProvider.debugEnabled() ? $delegate.info : function() {};
    $delegate.log = $logProvider.debugEnabled() ? $delegate.log : function() {};
    return $delegate;
});
Ignacio Martínez
quelle
0

Nun, da die Lösung erfordert, dass wir das VerboseFlag aktivieren, besteht der beste Weg, die Protokollierung im Winkel zu handhaben, darin, einfach die native console.logFunktion in der Produktionsumgebung für die gesamte Anwendung zu ändern .

angular.module("myModule")
.config(function(){
    //if production environment
    console.log = ()=>{};
})

Das ist es. In der Produktionsumgebung sollte dies die Protokollierung überall deaktivieren. Außerdem muss $logjetzt nicht mehr in jeden Controller injiziert werden. Funktioniert einfach console.log("logging message")!

Sie können auch deaktivieren console.info, console.warn, console.errorund auf console.debugdie gleiche Weise wie pro Ihre Notwendigkeit.

Meliodas
quelle