Android Log.v (), Log.d (), Log.i (), Log.w (), Log.e () - Wann sollte jeder verwendet werden?


329

Die verschiedenen LogCatMethoden sind:

Log.v(); // Verbose
Log.d(); // Debug
Log.i(); // Info
Log.w(); // Warning
Log.e(); // Error

Welche Situationen sind für die Verwendung der einzelnen Protokollierungsarten geeignet? Ich weiß, dass es vielleicht nur ein bisschen Semantik ist und es vielleicht nicht wirklich wichtig ist, aber für das LogCatFiltern in Android Studio und Eclipse wäre es schön zu wissen, dass ich zu den richtigen Zeiten die richtigen Methoden verwende.

Antworten:


725

Gehen wir in umgekehrter Reihenfolge vor:

  • Log.e : Dies ist für den Fall, dass schlechte Dinge passieren . Verwenden Sie dieses Tag an Stellen wie in einer catch-Anweisung. Sie wissen, dass ein Fehler aufgetreten ist, und protokollieren daher einen Fehler.

  • Log.w : Verwenden Sie diese Option, wenn Sie den Verdacht haben, dass etwas Schattiges vor sich geht. Möglicherweise befinden Sie sich im Fehlermodus nicht vollständig, haben sich jedoch möglicherweise von einem unerwarteten Verhalten erholt. Verwenden Sie dies im Grunde genommen, um Dinge zu protokollieren, die Sie nicht erwartet haben, die aber nicht unbedingt ein Fehler sind. Ein bisschen wie ein "Hey, das ist passiert, und es ist komisch , wir sollten uns darum kümmern."

  • Log.i : Verwenden Sie diese Option , um nützliche Informationen in das Protokoll aufzunehmen. Zum Beispiel: dass Sie erfolgreich eine Verbindung zu einem Server hergestellt haben. Verwenden Sie es grundsätzlich, um Erfolge zu melden.

  • Log.d : Verwenden Sie diese Option zum Debuggen . Wenn Sie eine Reihe von Nachrichten ausdrucken möchten, um den genauen Ablauf Ihres Programms zu protokollieren, verwenden Sie diese Option. Wenn Sie ein Protokoll mit variablen Werten führen möchten, verwenden Sie dieses.

  • Log.v : Verwenden Sie diese Option, wenn Sie mit Ihrer Protokollierung absolut verrückt werden möchten. Wenn Sie aus irgendeinem Grund beschlossen haben, alle Kleinigkeiten in einem bestimmten Teil Ihrer App zu protokollieren, verwenden Sie das Tag Log.v.

Und als Bonus ...

  • Log.wtf : Verwenden Sie dies, wenn Sachen absolut, schrecklich, heiliger Mist schief gehen. Sie kennen die Catch-Blöcke, in denen Sie Fehler abfangen, die Sie niemals bekommen sollten ... Ja, wenn Sie sie protokollieren möchten, verwenden Sie Log.wtf

Log.v dient zur VerboseProtokollierung. Es ist das, was Sie verwenden, wenn Sie jede mögliche logische Operation ausgeben möchten.
Slayton

2
Hey Kumpel! Endlich mache ich Android-Arbeiten bei Google. Und ich bin darauf gestoßen, als ich versucht habe, herauszufinden, wie man Dinge protokolliert. :)
Mysticial

11
Ich glaubte nicht, dass Log.wtfich ein paar Mal nachgesehen und wirklich laut gelacht hatte. Meiner Meinung nach sollten alle APIs so etwas in sich haben
MBH

57
wtf steht für "What a Terrible Failure"
Abhishek

8
Wer hat diese Methode benannt? Das ist eine schreckliche Idee. Ich frage mich, wie mein Team es schätzen würde, wenn ich meine Sachen mit nur 1 Buchstaben benennen würde. Wetten, dass sie mich zur Hölle schicken würden?
SandRock

19

Die verschiedenen Methoden sind Prioritätsangaben. Wie Sie sie aufgelistet haben, gehen sie vom am wenigsten zum wichtigsten über. Ich denke, wie Sie sie speziell Debug-Protokollen in Ihrem Code zuordnen, hängt von der Komponente oder App ab, an der Sie arbeiten, sowie davon, wie Android sie mit verschiedenen Build-Varianten (eng, userdebug und user) behandelt. Ich habe eine Menge Arbeit in den nativen Dämonen in Android geleistet, und so mache ich es. Es gilt möglicherweise nicht direkt für Ihre App, aber es gibt möglicherweise Gemeinsamkeiten. Wenn meine Erklärung vage klingt, dann deshalb, weil einiges davon eher eine Kunst als eine Wissenschaft ist. Meine Grundregel lautet, so effizient wie möglich zu sein, sicherzustellen, dass Sie Ihre Komponente angemessen debuggen können, ohne die Leistung des Systems zu beeinträchtigen, und immer nach Fehlern zu suchen und diese zu protokollieren.

V - Ausdrucke des Zustands in verschiedenen Intervallen oder bei Ereignissen, die von meiner Komponente verarbeitet werden. Möglicherweise auch sehr detaillierte Ausdrucke der Nutzdaten von Nachrichten / Ereignissen, die meine Komponente empfängt oder sendet.

D - Details zu kleineren Ereignissen, die in meiner Komponente auftreten, sowie zu Nutzdaten von Nachrichten / Ereignissen, die meine Komponente empfängt oder sendet.

I - Der Header aller Nachrichten / Ereignisse, die meine Komponente empfängt oder sendet, sowie aller wichtigen Teile der Nutzlast, die für den Betrieb meiner Komponente kritisch sind.

W - Alles, was passiert, ist ungewöhnlich oder verdächtig, aber nicht unbedingt ein Fehler.

E - Fehler, dh Dinge, die nicht passieren sollen, wenn die Dinge so funktionieren, wie sie sollten.

Der größte Fehler, den die Leute machen, ist, dass sie Dinge wie V, D und I überbeanspruchen, aber niemals W oder E verwenden. Wenn ein Fehler per Definition nicht auftreten soll oder nur sehr selten auftreten sollte, ist er extrem billig für Sie, um eine Nachricht zu protokollieren, wenn es auftritt. Wenn Sie jedoch jedes Mal, wenn jemand eine Taste drückt, eine Log.i () ausführen, missbrauchen Sie die gemeinsam genutzte Protokollierungsressource. Verwenden Sie natürlich den gesunden Menschenverstand und seien Sie vorsichtig mit Fehlerprotokollen für Dinge, die außerhalb Ihrer Kontrolle liegen (wie Netzwerkfehler) oder solche, die in engen Schleifen enthalten sind.

Vielleicht schlecht

Log.i("I am here");

Gut

Log.e("I shouldn't be here");

Vor diesem Hintergrund können Sie die Basisprotokollierungsstufe für Ihren Code umso mehr einschränken, je näher Ihr Code der "Produktionsbereitschaft" kommt (Sie benötigen V in Alpha, D in Beta, I in der Produktion oder möglicherweise sogar W in der Produktion ). Sie sollten einige einfache Anwendungsfälle durchgehen und die Protokolle anzeigen, um sicherzustellen, dass Sie immer noch verstehen, was passiert, wenn Sie eine restriktivere Filterung anwenden. Wenn Sie mit dem folgenden Filter arbeiten, sollten Sie immer noch in der Lage sein zu erkennen, was Ihre App tut, aber möglicherweise nicht alle Details erhalten.

logcat -v threadtime MyApp:I *:S

6

Der Quellcode enthält einige grundlegende Anleitungen:

Die Reihenfolge in Bezug auf die Ausführlichkeit, von am wenigsten bis zu den meisten, ist ERROR, WARN, INFO, DEBUG, VERBOSE. Verbose sollte nur während der Entwicklung in eine Anwendung kompiliert werden. Debug-Protokolle werden kompiliert, aber zur Laufzeit entfernt. Fehler-, Warn- und Infoprotokolle werden immer geführt.

Für mehr Details ist Kurtis 'Antwort tot auf. Ich möchte nur hinzufügen: Protokollieren Sie keine persönlich identifizierbaren oder privaten Informationen unter INFO( WARN/ ERROR). Andernfalls können Fehlerberichte oder andere Elemente, die die Protokollierung enthalten, verschmutzt sein.


5

Sie können LOG verwenden wie:

Log.e(String, String) (error)
Log.w(String, String) (warning)
Log.i(String, String) (information)
Log.d(String, String) (debug)
Log.v(String, String) (verbose)

Beispielcode:

private static final String TAG = "MyActivity";
...
Log.i(TAG, "MyClass.getView() — get item number " + position);

3

Ich denke, der Sinn dieser verschiedenen Arten der Protokollierung ist, wenn Sie möchten, dass Ihre App ihre eigenen Protokolle grundsätzlich selbst filtert. Verbose könnte also sein, absolut alles Wichtige in Ihrer App zu protokollieren, dann würde die Debug-Ebene eine Teilmenge der ausführlichen Protokolle protokollieren, und dann würde die Info-Ebene eine Teilmenge der Debug-Protokolle protokollieren. Wenn Sie zu den Fehlerprotokollen gelangen, möchten Sie nur alle aufgetretenen Fehler protokollieren. Es gibt auch eine Debug-Stufe namens Fatal, wenn etwas den Fan in Ihrer App wirklich trifft.

Im Allgemeinen haben Sie Recht, es ist im Grunde genommen willkürlich und es liegt an Ihnen, zu definieren, was als Debug-Protokoll im Vergleich zu Informationen, gegenüber Fehlern usw. usw. betrachtet wird.


3

Obwohl diese Frage bereits beantwortet wurde, fehlen meiner Meinung nach Beispiele in der Antwort, die beantwortet wurde.

Deshalb werde ich hier das bringen, was ich in einem Blog-Beitrag "Android Log Levels" geschrieben habe.

Ausführlich

Ist die niedrigste Protokollierungsstufe. Wenn Sie mit dem Protokollieren verrückt werden wollen, dann gehen Sie mit diesem Level. Ich habe nie verstanden, wann ich Verbose und wann Debug verwenden soll. Der Unterschied klang für mich sehr willkürlich. Ich habe es endlich verstanden, als ich auf den Quellcode von Android¹ hingewiesen wurde. "Verbose sollte nur während der Entwicklung in eine Anwendung kompiliert werden." Jetzt ist mir klar, wann immer Sie entwickeln und löschbare Protokolle hinzufügen möchten, die Ihnen während der Entwicklung helfen, ist es nützlich, die ausführliche Ebene zu haben, mit der Sie alle diese Protokolle löschen können, bevor Sie in die Produktion gehen.

Debuggen

Ist für Debugging-Zwecke. Dies ist die niedrigste Stufe, die in der Produktion sein sollte. Die hier enthaltenen Informationen sollen bei der Entwicklung helfen. In den meisten Fällen deaktivieren Sie dieses Protokoll in der Produktion, damit weniger Informationen gesendet werden, und aktivieren dieses Protokoll nur, wenn Sie ein Problem haben. Ich möchte mich anmelden, um alle Informationen zu debuggen, die die App vom Server sendet / empfängt (achten Sie darauf, keine Passwörter zu protokollieren !!!). Dies ist sehr hilfreich, um zu verstehen, ob der Fehler im Server oder in der App liegt. Ich mache auch Protokolle über das Ein- und Aussteigen wichtiger Funktionen.

Die Info

Für Informationsmeldungen, die den Fortschritt der Anwendung hervorheben. Zum Beispiel, wenn die Initialisierung der App abgeschlossen ist. Fügen Sie Informationen hinzu, wenn der Benutzer zwischen Aktivitäten und Fragmenten wechselt. Protokollieren Sie jeden API-Aufruf, aber nur wenige Informationen wie URL, Status und Antwortzeit.

Warnung

Wenn eine potenziell schädliche Situation vorliegt.

Dieses Protokoll ist meiner Erfahrung nach ein schwieriges Level. Wann haben Sie eine potenziell schädliche Situation? Im Allgemeinen oder dass es in Ordnung ist oder dass es ein Fehler ist. Ich persönlich benutze dieses Level nicht viel. Beispiele dafür, wann ich es benutze, sind normalerweise, wenn Dinge mehrmals passieren. Beispielsweise hat ein Benutzer mehr als dreimal ein falsches Passwort. Dies kann daran liegen, dass er das Passwort dreimal falsch eingegeben hat. Es kann auch daran liegen, dass ein Problem mit einem Zeichen vorliegt, das in unserem System nicht akzeptiert wird. Gleiches gilt für Netzwerkverbindungsprobleme.

Error

Fehlerereignisse. Die Anwendung kann nach dem Fehler weiterhin ausgeführt werden. Dies kann zum Beispiel sein, wenn ich einen Nullzeiger bekomme, wo ich keinen bekommen soll. Beim Parsen der Antwort des Servers ist ein Fehler aufgetreten. Ich habe einen Fehler vom Server erhalten.

WTF (Was für ein schrecklicher Fehler)

Schwerwiegend sind schwerwiegende Fehlerereignisse, die zum Beenden der Anwendung führen. In Android ist das Fatal in Wirklichkeit die Fehlerstufe, der Unterschied besteht darin, dass es auch den Fullstack hinzufügt.


2

Die Android Studio-Website hat kürzlich (glaube ich) einige Ratschläge gegeben, welche Art von Nachrichten von verschiedenen Protokollebenen zu erwarten sind, die zusammen mit Kurtis 'Antwort nützlich sein können:

  • Ausführlich - Alle Protokollnachrichten anzeigen (Standardeinstellung).
  • Debug - Zeigt Debug-Protokollnachrichten an, die nur während der Entwicklung nützlich sind, sowie die Nachrichtenebenen in dieser Liste.
  • Info - Zeigt die erwarteten Protokollnachrichten für die reguläre Verwendung sowie die in dieser Liste niedrigeren Nachrichtenebenen an.
  • Warnen - Zeigen Sie mögliche Probleme an, bei denen es sich noch nicht um Fehler handelt, sowie die niedrigeren Nachrichtenebenen in dieser Liste.
  • Fehler - Zeigt Probleme an, die Fehler verursacht haben, sowie die niedrigere Nachrichtenebene in dieser Liste.
  • Assert - Zeigen Sie Probleme an, von denen der Entwickler erwartet, dass sie niemals auftreten sollten.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.