2010-11-08 44 views
22

Tengo un poco de dificultad para configurar el registro de Android. Así es como se ve mi código:Android niveles de registro

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

Bastante simple, ¿no?

Sin embargo, estoy teniendo un poco de dificultad para que el Log.isLoggable("MY_TAG", Log.VERBOSE) sea verdadero.

por http://developer.android.com/reference/android/util/Log.html, He intentado añadir un archivo a la local.prop/datos/directorio que se parece a esto:

log.tag.MY_TAG=VERBOSE 

pero no hubo suerte. También probé:

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

pero eso tampoco funciona.

¿Alguna idea sobre lo que estoy haciendo mal aquí? Estoy ejecutando Android 2.1-update1 en un Nexus 1 si eso hace alguna diferencia.

Respuesta

30

Trate

adb shell setprop log.tag.MyAppTag VERBOSE 
+2

Esto funciona! Sería muy agradable si pudiera modificar estas propiedades de shell a través de una llamada System.setProperty en Java. – seanoshea

+1

Tenga en cuenta los valores de las propiedades establecidos de este modo después de reiniciar el dispositivo. Entonces, tendrá que ingresar el comando nuevamente si lo necesita. –

+0

Si tiene la aplicación Tasker (unos pocos dólares en Play Store), puede hacer que este comando se ejecute cuando su dispositivo se inicie creando un nuevo perfil con event = System> Device Boot and task Code> Run Shell with command = "setprop log.tag.MyAppTag VERBOSE ". Tuve que ejecutar el comando como root (marque la casilla en Tasker) para que funcione. –

9

Un objetivo importante es que no se entregue una aplicación de producción con una tonelada de registro de llamadas que quedan en ella, aumentando su tamaño, e incluso posiblemente incluso afectar a su rendimiento.

Para ello, mi recomendación es poner estas constantes en la parte superior de cada clase que se va a tener llamadas de registro:

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

Ahora donde se inicia la sesión, haga lo siguiente:

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

Encienda sus registros cambiando la constante DEBUG a verdadero. (Si lo desea, podría tener una clase con estas estadísticas para que todo el código de su aplicación lo use ... Eso tiene sentido para una aplicación pequeña, pero a medida que las cosas se agrandan, es bueno decidir qué partes iniciar sesión).

Al hacer esto, cuando construyes tu aplicación con DEBUG = false, no solo no se ejecuta todo tu código de registro, sino que se elimina por completo de tu aplicación. Esto es bueno porque te permite dejar un registro bastante extenso en tu código para que se encienda cuando lo necesites, sin preocuparte por cómo afectará el tamaño de tu aplicación de envío. Básicamente, solo registre los registros donde los necesite y no se preocupe por dejarlos.

Este es el enfoque que toma gran parte del sistema Android. Por ejemplo, el Activity ManagerService.

Esto tiene esas constantes en la parte superior, y varias líneas de registro salpicadas a través de ellas. (Y un montón de otras constantes de sub-depuración para varios aspectos, ya que este archivo es ridículamente estúpido).

+5

Tenga en cuenta que puede utilizar 'BuildConfig.DEBUG', en lugar de su propio' DEBUG', en las versiones recientes de las herramientas de desarrollo (definitivamente en R20 y más allá). – CommonsWare

+1

@hackbod entonces, ¿cómo podremos, cuando un probador informe algo, buscar en los registros y esperar encontrar algo? Sería mejor activar DEBUG en tiempo de ejecución, pero ¿cómo? – likejiujitsu

17

Parece que las versiones posteriores de Android quieren que /data/local.prop se pueda escribir solo por root. Parece que el comando adb push crea inicialmente archivos con acceso de lectura/escritura a todos (porque la máscara de archivo predeterminada es 777). Android, sabiamente, ignora /data/local.prop ya que esto puede ser un riesgo para la seguridad.

Solo he experimentado con Android 2.3.3 y 4.1.2.El primero no tiene problemas con la lectura de un local.prop que se puede escribir en todo el mundo, mientras que el último parece ignorar silenciosamente el contenido del archivo.

Creación de un archivo local.prop como se describe en la pregunta original:

log.tag.MY_TAG=VERBOSE 

Y luego empujándolo hacia el dispositivo de la siguiente parece hacer el truco:

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

se puede revisar para hacer Asegúrese de que los valores en local.prop se leyeron ejecutando:

adb shell getprop | grep log.tag 

Así que en resumen:

  • /data/local.prop se lee únicamente durante el arranque.
  • Las versiones posteriores de Android parecen requerir que los permisos en el archivo /data/local.prop se establezcan correctamente o que no se lean. El archivo debe poder escribirse solo por root.

El uso de adb shell setprop log.tag.MyAppTag VERBOSE también funciona. El problema es que los valores de las propiedades se pierden después de un reinicio.

+2

¿Hay alguna manera de hacer esto para todas las etiquetas de registro, sin especificar cada una explícitamente? Estoy trabajando en una aplicación donde la etiqueta generalmente se configura con el nombre de la clase, por lo que hay MUCHAS etiquetas. – markproxy

Cuestiones relacionadas