java eclipse pmd java.util.logging

java - Logger vs. System.out.println



eclipse pmd (6)

Estoy usando el plugin PMD para eclipse y me da un error al usar System.out.println() con la explicación:

Sistema. (Out | err) .print se usa, considere usar un registrador.

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


Este enlace proporciona información más concisa sobre cómo usar Log4j: ¡No use System.out.println! Sin embargo, solo tiene un pequeño error, no debería colocar la biblioteca en /jre/lib/ext , sino solo en el classpath en tiempo de ejecución de su aplicación y enviarla consigo.

La ventaja es que puede usar niveles de registro para indicar la importancia de la información, de modo que pueda configurar externamente qué niveles mostrar / ocultar en la salida (para que no se moleste por la información, después de todo 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 el caso de, por ejemplo, archivos también cómo deberían crearse (p. ej., grupo por año, mes y / o día).

Hay varias implementaciones de registradores como java.util.logging.Logger incorporado de Java SE, el Apache Commons Logging , el popular Apache Log4j , su sucesor Logback , etc. Puede usar Slf4j como una capa de abstracción adicional para cambiar entre cualquiera de esos madereros siempre que sea necesario.


Los madereros tienen múltiples niveles para el registro.

Si estamos escribiendo un programa realmente corto, solo para fines de aprendizaje, System.out.println está bien, pero cuando estemos desarrollando un proyecto de software de calidad, deberíamos usar un registrador profesional y los SOP deberían evitarse.

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 estar impresos 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 una cantidad de opciones. Incluso podemos crear una opción de salida personalizada y redirigirla a eso.


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

Si lo haces, vas a tener mucho mejor tiempo para escribir en un registrador como Log4J , ya que tendrá múltiples opciones de transmisión además de la pantalla.

Sin embargo, si está haciendo una aplicación de consola y llama a System.out como parte de eso, ignore la advertencia.


Si está utilizando System.out | err.println (..) para imprimir información de usuario en la consola en el método main () de su 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 opción "Marcar como revisado" en el Contorno de infracciones de PMD para este propósito.

Por supuesto, puedes engañar al PMD con el siguiente fragmento de código:

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

Fuera de su método main () use un Log-System como, por ejemplo, Log4j.

ACTUALIZAR:

También puede modificar la regla PMD "SystemPrintln" para usar el 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 llamado ''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.


Vea esta breve introducción a log4j .

El problema está en utilizar 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, apagarlo, personalizarlo, etc.

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


System.out.println no es bueno de 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.