Ich habe zum Beispiel viele Protokollierungsanweisungen zum Debuggen.
Log.v(TAG, "Message here");
Log.w(TAG, " WARNING HERE");
Während der Bereitstellung dieser Anwendung auf dem Gerätetelefon möchte ich die ausführliche Protokollierung deaktivieren, von wo aus ich die Protokollierung aktivieren / deaktivieren kann.
Antworten:
Eine übliche Methode besteht darin, ein int mit dem Namen loglevel zu erstellen und dessen Debug-Level basierend auf loglevel zu definieren.
Später können Sie einfach die LOGLEVEL für alle Debug-Ausgabepegel ändern.
quelle
In der Android-Dokumentation wird Folgendes zu Protokollstufen angegeben :
Daher sollten Sie in Betracht ziehen, das Protokoll zu entfernen. Ausführliche Protokollierungsanweisungen, möglicherweise unter Verwendung von ProGuard, wie in einer anderen Antwort vorgeschlagen .
Gemäß der Dokumentation können Sie die Protokollierung auf einem Entwicklungsgerät mithilfe der Systemeigenschaften konfigurieren. Die Eigenschaft Satz ist ,
log.tag.<YourTag>
und es sollte auf einem der folgenden Werte gesetzt werden:VERBOSE
,DEBUG
,INFO
,WARN
,ERROR
,ASSERT
, oderSUPPRESS
. Weitere Informationen hierzu finden Sie in der Dokumentation zurisLoggable()
Methode.Mit dem
setprop
Befehl können Sie Eigenschaften vorübergehend festlegen . Beispielsweise:Alternativ können Sie sie in der Datei '/data/local.prop' wie folgt angeben:
Spätere Versionen von Android erfordern anscheinend, dass /data/local.prop schreibgeschützt ist . Diese Datei wird beim Booten gelesen, sodass Sie sie nach dem Aktualisieren neu starten müssen. Wenn
/data/local.prop
die Welt beschreibbar ist, wird sie wahrscheinlich ignoriert.Schließlich können Sie sie mithilfe der
System.setProperty()
Methode programmgesteuert festlegen .quelle
android.util.Config
Konstanten zu erwähnen, die veraltet sind. Die in den API-Dokumenten angegebenen fest codierten Werte sind nutzlos, da diese (angeblich) je nach Build variieren. Daher schien die ProGuard-Route die beste Lösung für uns zu sein.Der einfachste Weg ist wahrscheinlich, Ihre kompilierte JAR vor der Bereitstellung über ProGuard auszuführen. Die Konfiguration lautet wie folgt :
Dadurch werden - abgesehen von allen anderen ProGuard-Optimierungen - alle ausführlichen Protokollanweisungen direkt aus dem Bytecode entfernt.
quelle
Ich habe einen einfachen Weg eingeschlagen - eine Wrapper-Klasse zu erstellen, die auch variable Parameterlisten verwendet.
quelle
Der bessere Weg ist die Verwendung der SLF4J-API + eines Teils ihrer Implementierung.
Für Android-Anwendungen können Sie Folgendes verwenden:
quelle
logback-android
(dalogback
richtig nicht kompatibel ist).logback-android-1.0.10-1.jar
ist 429 KB, was angesichts der bereitgestellten Funktionen nicht schlecht ist, aber die meisten Entwickler würden Proguard verwenden, um ihre Anwendung trotzdem zu optimieren.Du solltest benutzen
quelle
Das Entfernen der Protokollierung mit Proguard (siehe Antwort von @Christopher) war einfach und schnell, führte jedoch dazu, dass Stapelspuren aus der Produktion nicht mit der Quelle übereinstimmten, wenn in der Datei eine Debug-Protokollierung vorhanden war.
Stattdessen wird hier eine Technik verwendet, die unterschiedliche Protokollierungsstufen in der Entwicklung und in der Produktion verwendet, vorausgesetzt, Proguard wird nur in der Produktion verwendet. Es erkennt die Produktion, indem es prüft, ob proguard einen bestimmten Klassennamen umbenannt hat (im Beispiel verwende ich "com.foo.Bar" - Sie würden dies durch einen vollständig qualifizierten Klassennamen ersetzen, von dem Sie wissen, dass er von proguard umbenannt wird).
Diese Technik verwendet die Commons-Protokollierung.
quelle
Log4j oder slf4j können zusammen mit logcat auch als Protokollierungsframeworks in Android verwendet werden. Siehe das Projekt android-logging-log4j oder log4j Unterstützung in Android
quelle
Es gibt einen winzigen Ersatz für die Standard-Android-Log-Klasse - https://github.com/zserge/log
Grundsätzlich müssen Sie nur die Importe von
android.util.Log
nach ersetzentrikita.log.Log
.Application.onCreate()
Suchen Sie dann in Ihrem oder einem statischen Initializer nach demBuilConfig.DEBUG
oder einem anderen Flag und verwendenLog.level(Log.D)
oderLog.level(Log.E)
ändern Sie die minimale Protokollstufe. Sie können dieLog.useLog(false)
Protokollierung überhaupt deaktivieren.quelle
Möglicherweise können Sie diese Protokollerweiterungsklasse sehen: https://github.com/dbauduin/Android-Tools/tree/master/logs .
Damit können Sie die Protokolle genau steuern. Sie können beispielsweise alle Protokolle oder nur die Protokolle einiger Pakete oder Klassen deaktivieren.
Darüber hinaus werden einige nützliche Funktionen hinzugefügt (z. B. müssen Sie nicht für jedes Protokoll ein Tag übergeben).
quelle
Ich habe ein Dienstprogramm / Wrapper erstellt, das dieses Problem und andere häufig auftretende Probleme im Zusammenhang mit der Protokollierung löst.
Ein Debugging-Dienstprogramm mit folgenden Funktionen:
Wie benutzt man?
Ich habe versucht, die Dokumentation autark zu machen.
Vorschläge zur Verbesserung dieses Dienstprogramms sind willkommen.
Kostenlos zu nutzen / zu teilen.
Laden Sie es von GitHub herunter .
quelle
Hier ist eine komplexere Lösung. Sie erhalten eine vollständige Stapelverfolgung und die Methode toString () wird nur bei Bedarf aufgerufen (Leistung). Das Attribut BuildConfig.DEBUG ist im Produktionsmodus falsch, sodass alle Trace- und Debug-Protokolle entfernt werden. Der Hot-Spot-Compiler hat die Möglichkeit, die Aufrufe aufgrund der endgültigen statischen Eigenschaften zu entfernen.
Verwendung wie folgt:
quelle
In einem sehr einfachen Protokollierungsszenario, in dem Sie während der Entwicklung buchstäblich nur versuchen, zu Debugging-Zwecken in die Konsole zu schreiben, ist es möglicherweise am einfachsten, vor dem Erstellen der Produktion einfach zu suchen und zu ersetzen und alle Aufrufe von Log oder System zu kommentieren. out.println.
Angenommen, Sie haben das "Protokoll" nicht verwendet. Überall außerhalb eines Aufrufs von Log.d oder Log.e usw. können Sie einfach die gesamte Lösung suchen und ersetzen, um "Log" zu ersetzen. mit "// Log." Um alle Ihre Protokollierungsaufrufe zu kommentieren, oder in meinem Fall verwende ich nur System.out.println überall. Bevor ich zur Produktion gehe, mache ich einfach eine vollständige Suche und ersetze nach "System.out.println" und ersetze durch "//System.out.println".
Ich weiß, dass dies nicht ideal ist, und es wäre schön, wenn die Möglichkeit, Aufrufe von Log und System.out.println zu finden und zu kommentieren, in Eclipse integriert wäre. Bis dahin ist dies jedoch der einfachste, schnellste und beste Weg durch Suchen und Ersetzen auskommentieren. Wenn Sie dies tun, müssen Sie sich keine Gedanken über nicht übereinstimmende Stack-Trace-Zeilennummern machen, da Sie Ihren Quellcode bearbeiten und keinen Overhead hinzufügen, indem Sie die Konfiguration auf Protokollebene usw. überprüfen.
quelle
In meinen Apps habe ich eine Klasse, die die Log-Klasse umschließt, die eine statische boolesche Variable namens "state" hat. Während meines gesamten Codes überprüfe ich den Wert der Variablen "state" mit einer statischen Methode, bevor ich tatsächlich in das Protokoll schreibe. Ich habe dann eine statische Methode, um die Variable "state" festzulegen, die sicherstellt, dass der Wert für alle von der App erstellten Instanzen gleich ist. Dies bedeutet, dass ich die gesamte Protokollierung für die App in einem Aufruf aktivieren oder deaktivieren kann - auch wenn die App ausgeführt wird. Nützlich für Supportanrufe ... Es bedeutet, dass Sie sich beim Debuggen an Ihre Waffen halten müssen und nicht auf die Verwendung der Standard-Log-Klasse zurückgreifen müssen ...
Es ist auch nützlich (praktisch), dass Java eine boolesche Variable als false interpretiert, wenn ihr kein Wert zugewiesen wurde. Dies bedeutet, dass sie als false belassen werden kann, bis Sie die Protokollierung aktivieren müssen :-)
quelle
Wir können die Klasse
Log
in unserer lokalen Komponente verwenden und die Methoden als v / i / e / d definieren. Je nach Bedarf können wir weiter telefonieren.Beispiel ist unten gezeigt.
Hier ist die Nachricht für
string
und undargs
ist der Wert, den Sie drucken möchten.quelle
Für mich ist es oft nützlich, für jeden TAG unterschiedliche Protokollstufen festlegen zu können.
Ich benutze diese sehr einfache Wrapper-Klasse:
Stellen Sie jetzt einfach die Protokollstufe pro TAG am Anfang jeder Klasse ein:
quelle
Eine andere Möglichkeit besteht darin, eine Protokollierungsplattform zu verwenden, mit der Protokolle geöffnet und geschlossen werden können. Dies kann manchmal sogar in einer Produktions-App viel Flexibilität bieten, welche Protokolle geöffnet und welche geschlossen sein sollten, je nachdem, welche Probleme Sie beispielsweise haben:
quelle