multiple log files java logging junit timestamp logfiles

java - log4j multiple log files



log4j vs. System.out.println-ventajas del registrador? (5)

Estoy usando log4j por primera vez en un proyecto. Un compañero programador me dijo que el uso de System.out.println se considera un estilo malo y que log4j es algo así como el estándar para el registro de hoy en día.

Hacemos muchas pruebas de JUnit: las cosas de System.out resultan ser más difíciles de probar.

Por lo tanto, comencé a utilizar log4j para una clase de controlador de consola, eso es solo el manejo de parámetros de línea de comandos.

// log4j logger config org.apache.log4j.BasicConfigurator.configure(); Logger logger = LoggerFactory.getLogger(Console.class); Category cat = Category.getRoot();

Parece funcionar:

logger.debug("String");

Produce:

1 [main] DEBUG project.prototype.controller.Console - String

Tengo dos preguntas con respecto a esto:

  1. Desde mi punto de vista básico, el uso de este registrador debería proporcionarme opciones cómodas para escribir un archivo de registro con marcas de tiempo (en lugar de enviar correo no deseado a la consola) si el modo de depuración está habilitado en el registrador.
  2. ¿Por qué System.out.println es más difícil de probar? Busqué stackoverflow y encontré una receta de prueba . Entonces me pregunto qué tipo de ventaja obtengo al usar log4j.

El registrador da la capacidad de definir diferentes niveles de importancia de los mensajes registrados y la capacidad de utilizar diferentes receptores para la salida: la consola, un archivo, etc.

Además, es fácil habilitar o deshabilitar solo algún tipo de mensaje cuando se utiliza un registrador; por ejemplo, no desea ver todos los mensajes de depuración en producción.

No creo que el uso de registradores ofrezca ventajas significativas en las pruebas unitarias, pero preferiría incluso allí. En las pruebas unitarias, las pruebas suelen ser mi principal preocupación.

Por cierto, debería considerar usar algo como Commons Logging o SLF4J como una fachada de registro de marco; es un mal estilo vincular su código a un marco de registro específico. Common Logging y SLF4J facilitan el cambio de marcos de registro si así lo desea.


Todo lo que imprima en System.out pasará a "estándar fuera", y aunque puede redirigir el estándar a un archivo y compararlo, qué es lo que tiene, eso es muy inflexible. Además, no puede filtrar lo que va a estándar si usa System.out ... todo se imprimirá. Con log4j, puede establecer diferentes niveles de registro, de modo que no se impriman los mensajes de registro que están por debajo de un determinado umbral de gravedad / importancia (por ejemplo, si cambia el nivel de registro a ADVERTENCIA, los mensajes DEBUG e INFO ya no se mostrarán).

Además, log4j permite que el registro se controle clase por clase, mientras que System.out solo se puede controlar con la granularidad de toda la aplicación (si redirige System.out, lo redirecciona para todo el programa). Por el contrario, a cada registrador en log4j se le puede asignar un apéndice diferente. Además, puede dar a un log4j logger múltiples appenders (para que vaya al registrador del sistema y a través de la red, por ejemplo). Incluso puede tener un registrador log4j anexado a un StringBuilder, para que pueda leer fácilmente lo que se escribió. Y aunque se puede redirigir System.out, esta redirección tiende a ser bastante limitada; System.out puede ser redirigido a un archivo o a un conducto (a otro programa), pero no sería capaz de redirigirlo a una URL, por ejemplo; por el contrario, sería muy fácil crear un appender que transmita mensajes de registro utilizando HTTP POST.


  1. Use por ejemplo

    org.apache.log4j.BasicConfigurator.configure(new FileAppender( new PatternLayout("%d{ISO8601} %-5p %t: %m%n"), // see e.g. http://en.wikipedia.org/wiki/Log4j#TTCC "log/mainWhatever.log"));

  2. Utilizando logger.setLevel(...) puede elegir si desea mostrar los logger.debug(..) , por ejemplo, establecerlo en advertir de nivel y no se imprimirán las instrucciones de seguimiento, depuración e información. Esto le ahorra el tiempo de tener que comentar solo las declaraciones de depuración ocasionalmente necesarias.

También echa un vistazo a Wikipedia .


Utilizando logger.setLevel (...) puede elegir si desea mostrar los mensajes de logger.debug (..), por ejemplo, establecerlo en advertir de nivel y no se imprimirán las instrucciones de seguimiento, depuración e información. Esto le ahorra el tiempo de tener que comentar solo las declaraciones de depuración ocasionalmente necesarias


En el caso de log4j, proporciona un servicio de middleware donde puede administrar niveles de registro como DEBUG, INFO, ERROR, etc. Y puede habilitar y deshabilitar el registro. Pero en el caso de System.out.println () debe administrar todo.