Supongo que la mayoría de ustedes conocen android.util.Log Todos los métodos de registro aceptan 'Etiqueta de cadena' como primer argumento.
Y mi pregunta es ¿Cómo suele etiquetar sus registros en sus aplicaciones? He visto un código duro como este:
public class MyActivity extends Activity {
private static final String TAG = "MyActivity";
//...
public void method () {
//...
Log.d(TAG, "Some logging");
}
}
Esto no se ve bien por muchas razones:
- Puede decirme que este código no tiene hardcode, pero lo tiene.
- Mi aplicación podría tener cualquier cantidad de clases en diferentes paquetes con el mismo nombre. Por lo que sería difícil leer el registro.
- No es flexible. Siempre ha puesto un TAG de campo privado en su clase.
¿Existe alguna forma sencilla de obtener un TAG para una clase?
Respuestas:
Yo uso un TAG, pero lo inicializo así:
De esta manera, cuando refactorice mi código, la etiqueta también cambiará en consecuencia.
fuente
"MyActivity.class.getName();"
. Siempre he pensado que "TAG" era solo un marcador de posición en ejemplos de Google, etc. ¡no unaStatic
variable real ! Esta es una solución mucho mejor gracias :)this.getClass().getName()
en su lugar para hacerla más genérica?Normalmente creo una
App
clase que se encuentra en un paquete diferente y contiene métodos estáticos útiles. Uno de los métodos es ungetTag()
método, de esta manera puedo obtener el TAG en todas partes.App
la clase se ve así:EDITAR : Mejorado por comentario br mob (Gracias :))
Y cuando quiero usarlo:
La salida del
getTag
método es el nombre de la clase que llama (con el nombre del paquete) y el número de línea desde dondegetTag
se llama, para facilitar la depuración.fuente
getStackTrace()
funciona. Pero no loVaya a Android Studio -> preferencia -> Plantillas en vivo -> AndroidLog y luego seleccione Log.d (TAG, String) .
En texto de plantilla, reemplazar
android.util.Log.d(TAG, "$METHOD_NAME$: $content$");
con
android.util.Log.d("$className$", "$METHOD_NAME$: $content$");
Luego haga clic en Editar variables e ingrese className () en la columna Expresión junto a la columna className Name .
Ahora, cuando escriba el atajo
logd
, pondráYa no es necesario definir un TAG.
fuente
Me gusta mejorar la respuesta de Yaniv si tiene el registro en este formato (nombre de archivo.java:XX) xx número de línea, puede vincular el acceso directo de la misma manera que se vincula cuando hay un error, de esta manera puedo ir directamente a la línea en cuestión con solo hacer clic en el logcat
Pongo esto dentro de mi aplicación extendida para poder usarlo en todos los demás archivos
Captura de pantalla:
fuente
AndroidStudio tiene una
logt
plantilla por defecto (puede escribirlogt
y presionar tabulador para que se expanda a un solo código). Recomiendo usar esto para evitar copiar y pegar la definición de TAG de otra clase y olvidar cambiar la clase a la que se refiere. La plantilla se expande de forma predeterminada aprivate static final String TAG = "$CLASS_NAME$"
Para evitar usar el nombre de la clase anterior después de la refactorización, puede cambiarlo a
private static final String TAG = $CLASS_NAME$.class.getSimpleName();
Recuerde marcar el botón "Editar variables" y asegurarse de que la
CLASS_NAME
variable esté definida para usar laclassName()
expresión y tenga marcada la opción "Omitir si está definida".fuente
He creado una clase de variables, métodos y clases estáticas con el nombre
S
.El siguiente es el método de registro:
Se llama de ninguna clase como
S.L(this, whaterver_object);
ElgetClass().getName()
también añade el nombre del paquete, por lo tanto, yo estoy quitando a cabo para evitar que la etiqueta innecesariamente largo.Ventajas:
Log.d(TAG,
toString
Log.d
ya que solo tengo que eliminar el método y las ubicaciones de todos los registros se marcan en rojo.CCC
(una cadena corta y fácil de escribir) para que sea fácil enumerar solo sus registros en el monitor de Android en Android Studio. A veces está ejecutando servicios u otras clases simultáneamente. Si tiene que buscar solo por el nombre de la actividad, entonces no puede ver exactamente cuándo se obtuvo una respuesta de servicio y luego se produjo una acción de su actividad. Un prefijo como CCC ayuda, ya que le brinda registros cronológicamente con la actividad en la que ocurrió.fuente
Context ctx
porObject ctx
yctx.getClass().getName().replace(ctx.getPackageName(), "")
porctx.getClass().getSimpleName()
. De esa manera, puedo llamar aS.L(Object, Object)
cualquier lugar (incluso enFragment
s que no se extiendenContext
, por instancia).Puede utilizar
this.toString()
para obtener un identificador único para la clase específica en la que imprime en el registro.fuente
toString()
haga.A expensas de actualizar estas cadenas cuando muevo código entre métodos o renombro métodos, me gusta hacer lo siguiente. Filosóficamente, también parece ser mejor mantener "ubicación" o "contexto" en la etiqueta, no en el mensaje.
El beneficio aquí es que puede filtrar un solo método incluso si el contenido no es estático, por ejemplo
El único inconveniente es que cuando cambio el nombre
f()
ag()
necesito tener en cuenta esa cadena. Además, la refactorización automática de IDE no los detectará.Durante un tiempo fui fanático de usar el nombre corto de la clase, quiero decir
LOG_TAG = MyClass.class.getSimpleName()
. Los encontré más difíciles de filtrar en los registros porque había menos para continuar.fuente
Es una pregunta muy antigua, pero incluso pensando en una respuesta actualizada para julio de 2018, es más preferible usar Timber. Para registrar el registro correcto, se pueden enviar errores y advertencias a bibliotecas de fallas de terceros, como Firebase o Crashlytics.
En la clase que implementa Application debes agregar esto:
No olvide la dependencia de la madera.
fuente
Para aquellos usuarios que visitan esta pregunta:
fuente
utilizan Timber para la aplicación IOsched 2019 para mostrar información de depuración:
implementation 'com.jakewharton.timber:timber:4.7.1'
uso
tenga en cuenta que esto hace que los registros estén disponibles solo durante el estado DEBUG y le facilita la tarea de eliminarlos manualmente para el lanzamiento en Google Play -
consulte este artículo https://medium.com/mindorks/better-logging-in-android-using-timber-72e40cc2293d
fuente
Normalmente uso el nombre del método como etiqueta pero de Thread
Esto evita la nueva excepción.
fuente
fuente
RuntimeException
solo para obtener el nombre de la clase actual? Muy mal.this.getClass().getName()
aunque tendría que eliminar el alcance estático delTAG