Evite printStackTrace (); use una llamada de registrador en su lugar

Respuestas:

137

Significa que debe usar un marco de registro como o y en lugar de imprimir excepciones directamente:

e.printStackTrace();

debe registrarlos usando la API de este framework:

log.error("Ops!", e);

Los marcos de registro le brindan mucha flexibilidad, por ejemplo, puede elegir si desea iniciar sesión en la consola o en el archivo, o tal vez omitir algunos mensajes si considera que ya no son relevantes en algún entorno.

Tomasz Nurkiewicz
fuente
39

Si llama printStackTrace()a una excepción, se escribe el seguimiento System.erry es difícil enrutarlo a otro lugar (o filtrarlo). En lugar de hacer esto, se le recomienda utilizar un marco de registro (o un contenedor alrededor de varios marcos de registro, como Apache Commons Logging) y registrar la excepción utilizando ese marco (por ejemplo logger.error("some exception message", e)).

Hacer eso te permite:

  • escribir la declaración de registro en diferentes ubicaciones a la vez, por ejemplo, la consola y un archivo
  • filtrar las declaraciones de registro por gravedad (error, advertencia, información, depuración, etc.) y origen (normalmente basado en paquetes o clases)
  • tener cierta influencia en el formato del registro sin tener que cambiar el código
  • etc.
Thomas
fuente
17

Un programa de calidad de producción debe utilizar una de las muchas alternativas de registro (por ejemplo, log4j, logback, java.util.logging) para informar errores y otros diagnósticos. Esto tiene una serie de ventajas:

  • Los mensajes de registro van a una ubicación configurable.
  • El usuario final no ve los mensajes a menos que configure el registro para que él / ella lo haga.
  • Puede utilizar diferentes registradores y niveles de registro, etc. para controlar la cantidad de registros que se registran.
  • Puede usar diferentes formatos de appender para controlar el aspecto del registro.
  • Puede conectar fácilmente la salida de registro en un marco de monitoreo / registro más grande.
  • Todo lo anterior se puede hacer sin cambiar su código; es decir, editando el archivo de configuración de registro de la aplicación implementada.

Por el contrario, si solo usa printStackTrace, el implementador / usuario final tiene poco o ningún control, y los mensajes de registro pueden perderse o mostrarse al usuario final en circunstancias inapropiadas. (Y nada aterroriza más a un usuario tímido que un seguimiento de pila aleatorio).

Esteban C
fuente
5

En Simple, e.printStackTrace () no es una buena práctica, porque simplemente imprime el seguimiento de la pila en el error estándar. Debido a esto, realmente no puede controlar a dónde va esta salida.

Sandip S.
fuente
0

Casi todos los marcos de registro proporcionan un método en el que podemos pasar el objeto arrojable junto con un mensaje. Me gusta:

public trace(Marker marker, String msg, Throwable t);

Imprimen el trazo de pila del objeto arrojadizo.

abhi shukla
fuente
Esto no responde a la pregunta.
Stephen C
-1

Hablemos del concepto de empresa. Log le ofrece niveles flexibles (consulte Diferencia entre logger.info y logger.debug ). Diferentes personas quieren ver diferentes niveles, como QA, desarrolladores, gente de negocios. Pero e.printStackTrace () imprimirá todo. Además, como si este método fuera llamado a descansar, este mismo error puede imprimirse varias veces. Entonces, las personas de Devops o Tech-Ops de su empresa pueden estar locas porque recibirán los mismos recordatorios de error. Creo que podría ser un mejor reemplazo. log.error("errors happend in XXX", e) Esto también imprimirá toda la información que es más fácil de leer que e.printStackTrace ()

Qiyu Zhang
fuente
-3

La razón principal es que Proguard eliminaría las llamadas de registro de producción. Porque al iniciar sesión o imprimir StackTrace, es posible verlos (información dentro del seguimiento de la pila o Log) dentro del teléfono Android, por ejemplo, mediante la aplicación Logcat Reader. De modo que es una mala práctica para la seguridad. Además, no accedemos a ellos durante la producción, sería mejor que nos retiraran de la producción. Como ProGuard elimina todas las llamadas de registro, no stackTrace, es mejor usar los bloques de captura de registro y dejar que Proguard los elimine de producción.

Amirhossein Hashemi
fuente