Problemas con el log en tomcat


Depuracion de log4j en el propio log


Para depurar log4j en Tomcat puedes usar -Dlog4j.debug al ejecutar tomcat.
En mi caso lo he añadido dentro de la variable JAVA_OPTS que esta en el fichero catalina.sh. Que es quien me arranca Tomcat.
Tambien se puede incluir como parte de la variable CATALINA_OPTS


ERROR Attempted to append to closed appender named


Cuando te da el error:

log4j:ERROR Attempted to append to closed appender named [pepito]

Pueden ocurrir dos cosas:

  1. has repetido el nombre de ese appender dentro de la configuracion del log.
  2. log4j se inicia dos veces. Al arrancar la primera vez, lanza el appender y le agrega los distintos loggers. Pero cuando se arranca por segunda vez… Se borra y carga de nuevo. Si tienes dos ficheros, por el motivo que sea, solo se va a cargar el que lea en 2º lugar. Evita este comportamiento.
    En mi caso, yo tenia mi fichero log4j.xml y luego mi aplicacion estaba configurada para que spring levantase el log. Aqui esta mi dualidad.
Problemas con el log en tomcat

Mejorando el log de log4j, con isDebugEnabled()

¿Porqué poner isDebugEnabled() isErrorEnabled(), etc?

Si el log de una aplicación está desactivado por completo o solo para unos niveles (error, warn…), el coste de una solicitud de log consiste en: llamada (invocación) al método + una comparación de enteros. Supone un coste en nanosegundos, pequeño, pero si tenemos la aplicación llena de líneas de log que no llaman a info… granito a granito creamos una montaña.

Si se pone log.isDebugEnabled() en el peor de los casos se pierde tiempo en evaluar la condición, pero hablamos de un tiempo inapreciable, mucho menor que en el caso anterior.

Por eso siempre que no vayamos a poner el nivel info es mejor preguntar, si estamos en ese nivel.

if(logger.isDebugEnabled() {
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}

Sacado del manual de log4j.

Mejorando el log de log4j, con isDebugEnabled()