2010-11-08 3 views
22

Ich habe ein wenig Schwierigkeiten beim Konfigurieren der Android-Protokollierung. Hier ist, wie mein Code aussieht:Android Protokollierungsstufen

if (Log.isLoggable("MY_TAG", Log.VERBOSE)) { 
     Log.v("MY_TAG", "Here's a log message"); 
    } 

Ziemlich einfach, oder?

Allerdings habe ich ziemlich viele Schwierigkeiten, die Log.isLoggable("MY_TAG", Log.VERBOSE) wahr zurück zu bekommen.

Per http://developer.android.com/reference/android/util/Log.html, habe ich versucht, in das Verzeichnis/data/Verzeichnis eine local.prop Datei hinzufügen, die wie folgt aussieht:

log.tag.MY_TAG=VERBOSE 

aber kein Glück. Ich habe auch versucht:

System.setProperty("log.tag.MY_TAG", String.valueOf(Log.VERBOSE)); 

aber das funktioniert auch nicht.

Irgendwelche Ideen, was ich hier falsch mache? Ich führe Android 2.1-Update1 auf einem Nexus 1, wenn das einen Unterschied macht.

Antwort

30

Versuchen

adb shell setprop log.tag.MyAppTag VERBOSE 
+2

Das funktioniert !!! Es wäre wirklich süß, wenn Sie diese Shell-Eigenschaften über einen System.setProperty-Aufruf in Java ändern könnten. – seanoshea

+1

Beachten Sie, dass Eigenschaftswerte wie diese nach einem Neustart des Geräts zurückgesetzt werden. Sie müssen den Befehl erneut eingeben, wenn Sie ihn benötigen. –

+0

Wenn Sie die App Tasker haben (ein paar Dollar im Play Store), können Sie diesen Befehl ausführen, wenn Ihr Gerät bootet, indem Sie ein neues Profil mit event = System> Gerätestart und Taskcode> Run Shell mit command = "setprop erstellen log.tag.MyAppTag VERBOSE ". Ich musste den Befehl als root ausführen (aktivieren Sie das Kontrollkästchen in Tasker), um es zum Laufen zu bringen. –

9

Ein wichtiges Ziel ist nicht mit einer Tonne von Protokoll Anrufe links darin, steigert seine Größe und sogar möglicherweise sogar Auswirkungen auf seine Leistung über eine Produktions App zu versenden.

Um dies zu tun, meine Empfehlung ist, diese Konstanten an der Spitze jeder Klasse zu setzen, die Log-Anrufe haben wird:

static final boolean DEBUG = false; 
static final String TAG = "<MyClass>" 

Jetzt einloggen, wo Sie, dies zu tun:

if (DEBUG) Log.v(TAG, "Something"); 

Aktivieren Sie Ihre Protokolle, indem Sie die Konstante DEBUG in "true" ändern. (Wenn Sie möchten, können Sie eine Klasse mit diesen Statiken für den gesamten Code Ihrer App verwenden ... Das ist sinnvoll für eine kleine App, aber wenn die Dinge groß werden, ist es nett zu entscheiden, welche Teile Sie anmeldet.)

Dadurch, wenn Sie Ihre App mit DEBUG = false erstellen, wird nicht Ihr gesamter Protokollierungscode nicht nur ausgeführt, sondern vollständig aus Ihrer App entfernt. Das ist gut, denn Sie können Ihren Code so ausführlich protokollieren, dass er bei Bedarf aktiviert wird, ohne dass Sie sich Gedanken darüber machen müssen, wie sich dies auf die Größe Ihrer Versandanwendung auswirkt. Im Grunde nur werfen Sie Protokolle, wo immer Sie sie brauchen, und sorgen Sie sich nicht darum, sie zu verlassen.

Dies ist der Ansatz, den viele der Android-Framework dauert. Zum Beispiel die Activity ManagerService.

Dies hat diese Konstanten an der Spitze, und verschiedene Protokollzeilen berall basierend darauf gestreut. (Und eine Reihe von anderen Sub-Debug-Konstanten für verschiedene Aspekte davon, da diese Datei lächerlich groß ist.)

+5

Beachten Sie, dass Sie 'BuildConfig.DEBUG' statt Ihrer eigenen' DEBUG' in aktuellen Versionen der Entwicklungswerkzeuge verwenden können (definitiv in R20 und darüber hinaus). – CommonsWare

+1

@hackbod dann wie werden wir, wenn ein Tester etwas meldet, in den Protokollen suchen und erwarten, etwas zu finden? Es wäre besser, DEBUG zur Laufzeit zu aktivieren - aber wie? – likejiujitsu

17

Es scheint, dass spätere Versionen von Android /data/local.prop nur durch root schreibbar sein sollen. Der Befehl adb push scheint anfänglich Dateien zu erstellen, die allen Lese-/Schreibzugriff gewähren (da die Standarddateimaske 777 ist). Android ignoriert klugerweise /data/local.prop, da dies ein Sicherheitsrisiko darstellen kann.

Ich habe nur mit Android 2.3.3 und 4.1.2 experimentiert.Ersteres hat keine Probleme mit dem Lesen eines local.prop, der weltweit beschreibbar ist, während letzteres scheinbar den Inhalt der Datei ignoriert.

Erstellen einer local.prop Datei als in der ursprünglichen Frage beschrieben:

log.tag.MY_TAG=VERBOSE 

und dann auf das Gerät schieben, wie scheint, folgt den Trick zu tun:

adb push local.prop /data/local.prop 
adb shell chmod 644 /data/local.prop 
adb shell chown root.root /data/local.prop 
adb reboot 

Sie können überprüfen, um Vergewissern Sie sich, dass die Werte in local.prop gelesen wurden, indem Sie Folgendes ausführen:

adb shell getprop | grep log.tag 

Also zusammenfassend:

  • /data/local.prop wird nur während des Bootens gelesen.
  • Spätere Versionen von Android scheinen zu erfordern, dass die Berechtigungen für die /data/local.prop-Datei ordnungsgemäß festgelegt sein müssen, oder es wird nicht gelesen. Die Datei muss schreibgeschützt sein.

Mit adb shell setprop log.tag.MyAppTag VERBOSE auch arbeiten. Das Problem besteht darin, dass die Eigenschaftswerte nach einem Neustart verloren gehen.

+2

Gibt es eine Möglichkeit, dies für alle Protokoll-Tags zu tun, ohne jede explizit zu beschreiben? Ich arbeite an einer App, bei der das Tag normalerweise auf den Klassennamen festgelegt ist, also gibt es viele Tags. – markproxy

Verwandte Themen