Ich gehe davon aus, dass die meisten von Ihnen android.util.Log kennen. Alle Protokollierungsmethoden akzeptieren 'String tag' als erstes Argument.
Und meine Frage ist: Wie kennzeichnen Sie Ihre Protokolle normalerweise in Ihren Anwendungen? Ich habe einen Hardcode wie diesen gesehen:
public class MyActivity extends Activity {
private static final String TAG = "MyActivity";
//...
public void method () {
//...
Log.d(TAG, "Some logging");
}
}
Das sieht aus vielen Gründen nicht gut aus:
- Sie können mir sagen, dass dieser Code keinen Hardcode hat, aber er tut es.
- Meine Anwendung kann beliebig viele Klassen in verschiedenen Paketen mit demselben Namen enthalten. Es wäre also schwierig, das Protokoll zu lesen.
- Es ist nicht flexibel. Sie haben Ihrer Klasse immer ein privates Feld-TAG hinzugefügt.
Gibt es eine gute Möglichkeit, einen TAG für eine Klasse zu bekommen?
Antworten:
Ich benutze einen TAG, initialisiere ihn aber folgendermaßen:
Auf diese Weise ändert sich auch das Tag entsprechend, wenn ich meinen Code umgestalte.
quelle
"MyActivity.class.getName();"
. Ich habe immer gedacht, dass "TAG" nur ein Platzhalter in Beispielen von Google usw. ist ... keine tatsächlicheStatic
Variable! Dies ist eine viel bessere Lösung, danke :)this.getClass().getName()
stattdessen verwenden, um sie allgemeiner zu gestalten?Normalerweise erstelle ich eine
App
Klasse, die sich in einem anderen Paket befindet und nützliche statische Methoden enthält. Eine der Methoden ist einegetTag()
Methode, auf diese Weise kann ich die TAG überall bekommen.App
Klasse sieht so aus:EDIT : Verbesserter per br Mob Kommentar (Danke :))
Und wenn ich es benutzen will:
Die Ausgabe der
getTag
Methode ist der Name der Aufruferklasse (mit dem Paketnamen) und die Zeilennummer, von dergetTag
aus die aufgerufen wird, um das Debuggen zu vereinfachen.quelle
getStackTrace()
funktioniert. Aber ich werde es nicht benutzen, weil es teuer istGehen Sie zu Android Studio -> Einstellungen -> Live-Vorlagen -> AndroidLog und wählen Sie Log.d (TAG, String) .
Im Vorlagentext ersetzen
android.util.Log.d(TAG, "$METHOD_NAME$: $content$");
mit
android.util.Log.d("$className$", "$METHOD_NAME$: $content$");
Klicken Sie dann auf Variablen bearbeiten und geben Sie className () in die Spalte Ausdruck neben der Spalte className Name ein .
Wenn Sie nun die Verknüpfung eingeben
logd
, wird sie eingefügtSie müssen kein TAG mehr definieren.
quelle
Ich möchte die Antwort von Yaniv verbessern, wenn Sie das Protokoll in diesem Format haben (Dateiname.java:XX) Klicken Sie einfach auf den Logcat
Ich habe dies in meine erweiterte Anwendung eingefügt, damit ich es in jeder anderen Datei verwenden kann
Bildschirmfoto:
quelle
AndroidStudio verfügt
logt
standardmäßig über eine Vorlage (Sie können dielogt
Tabulatortaste eingeben und drücken, um sie zu einem einzelnen Code zu erweitern). Ich empfehle, dies zu verwenden, um zu vermeiden, dass die TAG-Definition aus einer anderen Klasse kopiert und vergessen wird, die Klasse zu ändern, auf die Sie sich beziehen. Die Vorlage wird standardmäßig auf erweitertprivate static final String TAG = "$CLASS_NAME$"
Um zu vermeiden, dass der alte Klassenname nach dem Refactoring verwendet wird, können Sie dies in ändern
private static final String TAG = $CLASS_NAME$.class.getSimpleName();
Denken Sie daran, die Schaltfläche "Variablen bearbeiten" zu aktivieren und sicherzustellen, dass die
CLASS_NAME
Variable für die Verwendung desclassName()
Ausdrucks definiert ist und "Überspringen, wenn definiert" aktiviert ist.quelle
Ich habe eine Klasse statischer Variablen, Methoden und Klassen mit dem Namen erstellt
S
.Das Folgende ist die Protokollierungsmethode:
Es wird in jeder Klasse aufgerufen, da
S.L(this, whaterver_object);
ThegetClass().getName()
auch den Paketnamen anfügt. Daher entferne ich ihn, um zu vermeiden, dass das Tag unnötig lang wird.Vorteile:
Log.d(TAG,
toString
Log.d
jemals zu löschen , da ich nur die Methode löschen muss und die Speicherorte aller Protokolle rot markiert werden.CCC
(eine kurze, einfach einzugebende Zeichenfolge), sodass es einfach ist, nur Ihre Protokolle im Android Monitor in Android Studio aufzulisten. Manchmal führen Sie Dienste oder andere Klassen gleichzeitig aus. Wenn Sie nur nach dem Aktivitätsnamen suchen müssen, können Sie nicht genau sehen, wann eine Serviceantwort erhalten wurde und dann eine Aktion aus Ihrer Aktivität ausgeführt wurde. Ein Präfix wie CCC hilft, da es Ihnen Protokolle chronologisch mit der Aktivität gibt, in der es aufgetreten istquelle
Context ctx
nachObject ctx
undctx.getClass().getName().replace(ctx.getPackageName(), "")
nach ersetztctx.getClass().getSimpleName()
. Auf diese Weise kann ichS.L(Object, Object)
überall anrufen (auch inFragment
s, die nichtContext
sofort erweitert werden).Sie können
this.toString()
eine eindeutige Kennung für die bestimmte Klasse abrufen, in der Sie im Protokoll drucken.quelle
toString()
tut , teuer werden .Auf Kosten der Aktualisierung dieser Zeichenfolgen beim Verschieben von Code zwischen Methoden oder beim Umbenennen von Methoden möchte ich Folgendes tun. Philosophisch scheint es auch besser zu sein, "Ort" oder "Kontext" im Tag zu behalten, nicht die Nachricht.
Der Vorteil hierbei ist, dass Sie eine einzelne Methode herausfiltern können, auch wenn der Inhalt nicht statisch ist, z
Der einzige Nachteil ist, dass ich beim Umbenennen
f()
ing()
diese Zeichenfolge berücksichtigen muss. Auch das automatische IDE-Refactoring fängt diese nicht ab.Ich meine, ich war eine Weile ein Fan von der Verwendung des Kurzklassennamens
LOG_TAG = MyClass.class.getSimpleName()
. Ich fand es schwieriger, sie in den Protokollen zu filtern, weil weniger zu tun war.quelle
Es ist eine sehr alte Frage, aber obwohl eine aktualisierte Antwort für Juli 2018 vorliegt, ist es vorzuziehen, Holz zu verwenden. Um die korrekte Protokollierung zu protokollieren, können Fehler und Warnungen an Absturzbibliotheken von Drittanbietern wie Firebase oder Crashlytics gesendet werden.
In der Klasse, die Application implementiert , sollten Sie Folgendes hinzufügen:
Vergessen Sie nicht die Holzabhängigkeit.
quelle
Für diejenigen Benutzer, die diese Frage besuchen:
quelle
Sie verwenden Timber für die IOsched-App 2019, um Debug-Informationen anzuzeigen:
implementation 'com.jakewharton.timber:timber:4.7.1'
Verwendung
Beachten Sie, dass dadurch die Protokolle nur während des DEBUG-Status verfügbar sind und Sie sie manuell für den Start in Google Play entfernen können.
Lesen Sie diesen Artikel unter https://medium.com/mindorks/better-logging-in-android-using-timber-72e40cc2293d
quelle
Normalerweise verwende ich den Methodennamen als Tag, aber von Thread
Dies vermeidet die neue Ausnahme.
quelle
quelle
RuntimeException
, um den aktuellen Klassennamen zu erhalten? Sehr schlecht.this.getClass().getName()
obwohl Sie den statischen Bereich derTAG