log4j y liferay

Andamos desarrollando portlets para liferay y claro, queremos poner nuestro log de debug, de info y demás en algún sitio. Como también desarrollamos algunos jar que se usarán en más sitios aparte del portlet y queremos que esos jar también tengan log, usamos log4j y no el logger que se aconseja usar con liferay

// Para portlets liferay
Log log = LogFactoryUtil.getLog(UnaClase.class);

// Con log4j
Logger log = Logger.getLogger(UnaClase.class);

 

siendo Log y LogFactoryUtil clases específicas de los jar de liferay y por tanto útiles para un portlet, pero no para una librería. Pos ese motivo, queremos usar log4j. Dicho y hecho, a ello.

Pero aparece un problema, en el log del tomcat donde está instalador nuestro liferay, en vez de aparecer el log de estas librerías usadas por nuestro portlet, aparece el siguiente error

og4j:ERROR A "org.apache.log4j.ConsoleAppender" object is not assignable to a "org.apache.log4j.Appender" variable.
log4j:ERROR The class "org.apache.log4j.Appender" was loaded by
log4j:ERROR [WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
———-> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@1ac1fe4
] whereas object of type
log4j:ERROR "org.apache.log4j.ConsoleAppender" was loaded by [WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
———-> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@1ac1fe4
].
log4j:ERROR Could not instantiate appender named "CONSOLE".

Vamos, que hay algún tipo de problema al intentar usar log4j en nuestra librería. Buscando por internet, se llega a la conclusión de que es un bug de liferay y que de alguna forma se lía con los classloader y los log4j.jar que pueden existir en nuestra aplicación portlet y los que ya tiene liferay. Buscando soluciones, la gente propone muchas y a algunos les funcionan y a otros no, otras parecen complejas y lo cierto es que casi todas las que he probado no me funcionan.

Y digo casi todas porque hay una que sí me ha funcionado y es poner la variable de entorno -Dlog4j.ignoreTCL=true. Esto debe hacer que log4j ignore esos errores y siga funcionando. He añadido esta variable al fichero /liferay_home/tomcat_xxxx/bin/setenv.sh y todo va de perlas.

El siguiente problema son los niveles de DEBUG. Por defecto deben salir de INFO para arriba. A mi me interesan los de DEBUG de nuestras clases. Tampoco he visto forma adecuada de configurarlo, pero lo he conseguido de una manera que no me gusta mucho. En webapps/ROOT/WEB-INF/classes del tomcat de liferay hay un log4j.properties. Ahí podemos configurar el nivel que queremos para nuestros logs y otras cosas propias de log4j. Basta añadir una línea con

log4j.logger.com.chuidiang.libreria=DEBUG

donde log4j.logger es fijo y com.chuidiang.libreria es el paquete por el que empiezan las clases de mi librería.

Por fin, el log4j funcionando de perlas.

 

Esta entrada ha sido publicada en log4j y etiquetada como , . Guarda el enlace permanente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.