2010-05-01 18 views
37

estoy usando el plugin para Eclipse PMD y me da un error cuando se utiliza System.out.println() con la explicación:Logger vs System.out.println

sistema (salir | err) se utiliza .print. , considere usar un registrador.

Mi pregunta es - ¿Qué es un registrador? ¿Cómo se usa para imprimir en la pantalla? ¿Por qué es mejor?

+0

Vea también esta pregunta reciente: http://stackoverflow.com/questions/2746578/advantage-of-log4j – BalusC

Respuesta

26

Ver this short introduction to log4j.

El problema está en usar System.out para imprimir información de depuración o diagnóstico. Es una mala práctica porque no puede cambiar fácilmente los niveles de registro, desactivarlo, personalizarlo, etc.

Sin embargo, si está utilizando legítimamente System.out para imprimir información al usuario, puede ignorar esta advertencia.

3

Parece que PMD está asumiendo que está llamando al System.out.println() con fines de depuración; cosas como "estoy en tu método, ejecutando codez ur".

Si lo hace, le va a ser mucho mejor escribir en un registrador como Log4J, ya que tendrá varias opciones de transmisión además de la pantalla.

Si, sin embargo, está haciendo una aplicación de consola y llama al System.out como parte de eso, ignore la advertencia.

0

System.out.println no es bueno para usar, ya que no se puede configurar. En lugar, Logger se puede configurar para iniciar sesión en varios niveles. Tiene muchas otras características.

5

Este enlace proporciona información más concisa acerca de cómo usar Log4j: Don't use System.out.println! Tiene sin embargo sólo una pequeña falla, se debe más bien no ponga la biblioteca en /jre/lib/ext, pero sólo en la ruta de clase en tiempo de ejecución de su solicitud y enviarlo junto.

La ventaja es que puede usar niveles de registro para indicar la importancia de la información, de manera que pueda configurar externamente qué niveles mostrar/ocultar en la salida (para que no se enoje con el - información inútil), cómo debe verse el resultado (por ejemplo, incluir una marca de tiempo, ID de hilo, nombre de clase, nombre de método, etc.) y dónde debe escribirse el resultado (por ejemplo, la consola, un archivo, un correo electrónico, etc.) y en caso de, por ejemplo, archivos también cómo deberían crearse (por ejemplo, grupo por año, mes y/o día).

Existen varias implementaciones como registrador incorporado del Java SE java.util.logging.Logger, la convenienced Apache Commons Logging, el popular Apache Log4j, su sucesor Logback, etc Usted puede utilizar Slf4j como una capa de abstracción extra para cambiar entre cualquiera de los registradores cuando sea necesario.

11

Si está utilizando System.out | err.println (..) para imprimir información de usuario en la consola en el método main() de la aplicación, no hace nada incorrecto. Puede deshacerse del mensaje insertando un comentario "// NOPMD".

System.out.println("Fair use of System.out.println(..).");// NOPMD 

Hay una "Marca como revisada" -Opción en el Esquema de violaciones de PMD para este propósito.

Por supuesto se puede engañar con PMD siguiente fragmento de código:

PrintStream out=System.out; 
out.println("I am fooling PMD."); 

Fuera de su main() - Método de uso de un registro de sistema como por ejemplo Log4j.

ACTUALIZACIÓN:

También puede modificar el PMD-Regla "SystemPrintln", para usar la siguiente XPath:

//MethodDeclaration[@MethodName!="main"]//Name[ 
starts-with(@Image, 'System.out.print') 
or 
starts-with(@Image, 'System.err.print') 
] | //Initializer//Name[ 
starts-with(@Image, 'System.out.print') 
or 
starts-with(@Image, 'System.err.print') 
] 

Esto ignorará System.out.println etc en cualquier método denominado ' main 'en su código, pero verifique System.out.println en el código del inicializador. Me gusta esto, porque desde mi punto de vista, System.out.println es seguro en el método 'main (String args [])'. Pero use con precaución, tengo que verificar, donde en el AST también puede ocurrir System.out.println y tengo que adaptar el XPath.

4

Los registradores tienen múltiples niveles para el registro.

Si estamos escribiendo un programa muy corto, solo para fines de aprendizaje System.out.println está bien, pero cuando estamos desarrollando un proyecto de software de calidad, debemos usar un registrador profesional y se deben evitar los SOP.

Un registrador profesional proporciona diferentes niveles de registro y flexibilidad. Podemos obtener el mensaje de registro en consecuencia. Por ejemplo, los mensajes del grupo X deben imprimirse solo en PRODUCCIÓN, los mensajes del grupo Y deben imprimirse en ERROR, etc.

Tenemos una opción limitada para redirigir los mensajes en System.out, pero en el caso de un registrador tiene appenders que proporciona números de opciones. Incluso podemos crear una opción de salida personalizada y redirigirla a eso.

Cuestiones relacionadas