2010-11-08 5 views
22

Ho difficoltà a configurare la registrazione di Android. Ecco come appare il mio codice:Livelli di registrazione Android

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

Abbastanza semplice, vero?

Tuttavia, sto avendo un po 'di difficoltà a ottenere il Log.isLoggable("MY_TAG", Log.VERBOSE) per restituire true.

Per http://developer.android.com/reference/android/util/Log.html, ho provato ad aggiungere un file local.prop al/data/directory che assomiglia a questo:

log.tag.MY_TAG=VERBOSE 

ma senza fortuna. Ho anche provato:

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

ma anche questo non funziona.

Qualche idea su cosa sto facendo male qui? Sto eseguendo Android 2.1-update1 su un Nexus 1 se questo fa alcuna differenza.

risposta

30

Prova

adb shell setprop log.tag.MyAppTag VERBOSE 
+2

Questo funziona !!! Sarebbe davvero carino se fosse possibile modificare queste proprietà della shell tramite una chiamata System.setProperty in Java. – seanoshea

+1

Tenere presente i valori delle proprietà impostati come questo ripristinati dopo il riavvio del dispositivo. Quindi dovrai inserire di nuovo il comando se ne hai bisogno. –

+0

Se hai l'app Tasker (alcuni dollari sul Play Store), puoi eseguire questo comando all'avvio del dispositivo creando un nuovo profilo con evento = Sistema> Avvio dispositivo e Codice attività> Esegui shell con command = "setprop log.tag.MyAppTag VERBOSE ". Ho dovuto eseguire il comando come utente root (selezionare la casella in Tasker) per farlo funzionare. –

9

Un obiettivo importante è quello di non spedire un'applicazione di produzione con una tonnellata di chiamate di log a sinistra in esso, aumentando la sua dimensione, e anche forse anche impattare le prestazioni.

Per fare questo, la mia raccomandazione è di mettere queste costanti nella parte superiore di ogni classe che sta per avere chiamate di registro:

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

Ora in cui si accede, fare questo:

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

Accendere i registri modificando la costante DEBUG su true. (Se vuoi, potresti avere una classe con queste statistiche per tutto il codice della tua app da utilizzare ... Questo ha senso per una piccola app, ma man mano che le cose diventano grandi è bello decidere quali parti attivare la registrazione.)

In questo modo, quando si crea l'app con DEBUG = false, tutto il codice di registrazione non solo non viene eseguito, ma viene completamente rimosso dall'app. Questo è utile perché ti consente di lasciare una registrazione abbastanza estesa del tuo codice da attivare quando ti serve, senza preoccuparti di come questo avrà un impatto sulle dimensioni della tua app di spedizione. Fondamentalmente basta lanciare i log ovunque siano necessari e non preoccuparti di lasciarli dentro.

Questo è l'approccio che richiede molto del framework Android. Ad esempio, lo Activity ManagerService.

Questo ha quelle costanti nella parte superiore e varie linee di registro cosparse in base a esse. (E un po 'di altre costanti di sotto-debug per vari aspetti, dal momento che questo file è ridicolmente stupido.)

+5

Nota che puoi usare 'BuildConfig.DEBUG', piuttosto che il tuo' DEBUG', sulle versioni recenti degli strumenti di sviluppo (sicuramente in R20 e oltre). – CommonsWare

+1

@hackbod, allora come faremo, quando un tester segnalerà qualcosa, guarda nei log e si aspetta di trovare qualcosa? Sarebbe meglio attivare DEBUG in fase di esecuzione, ma come? – likejiujitsu

17

Sembra che le versioni successive di Android vogliano scrivere /data/local.prop solo da root. Il comando adb push sembra inizialmente creare file con concessione a tutti gli accessi in lettura/scrittura (poiché la maschera file predefinita è 777). Android, saggiamente, ignora /data/local.prop poiché questo può essere un rischio per la sicurezza.

Ho solo sperimentato con Android 2.3.3 e 4.1.2.Il primo non ha problemi con la lettura di local.prop che è scrivibile in tutto il mondo, mentre il secondo sembra ignorare silenziosamente il contenuto del file.

Creazione di un file local.prop come descritto nella domanda iniziale:

log.tag.MY_TAG=VERBOSE 

E poi spingendolo sul dispositivo come segue sembra fare il trucco:

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

è possibile fare doppio controllo per assicurarsi sicuro che i valori in local.prop sono stati letti eseguendo:

adb shell getprop | grep log.tag 

Quindi in sintesi:

  • /data/local.prop viene letto solo durante l'avvio.
  • Le versioni successive di Android sembrano richiedere che le autorizzazioni sul file /data/local.prop debbano essere impostate correttamente, altrimenti non verranno lette. Il file deve essere scrivibile solo da root.

Utilizzare anche adb shell setprop log.tag.MyAppTag VERBOSE. Il problema è che i valori delle proprietà vengono persi dopo un riavvio.

+2

Esiste un modo per eseguire questa operazione per tutti i tag di registro, senza specificare esplicitamente ciascuno di essi? Sto lavorando a un'app in cui il tag è in genere impostato sul nome della classe, quindi ci sono molti tag. – markproxy