Log4j - JMS Appender con ActiveMQ

Como todos sabemos (y si no es así lo sabemos ahora), log4j permite usar topics JMS como destino de la información de log, en mi caso estoy acostumbrado a usar ActiveMQ como implementación de JMS por lo que será la que utilice para explicar el proceso, aunque se puede inferir el proceso para otras implementaciones de JMS como JBoss o WebLogic que son de las más utilizadas en la documentación que he visto.

Para utilizar ActiveMQ como destino de tus mensajes de log, necesitas configurar el appender JMS adecuadamente. El código de ejemplo (obtenido de la página oficial de ActiveMQ) para lograr esto es el siguiente:


log4j.rootLogger=INFO, stdout, jms

## Be sure that ActiveMQ messages are not logged to 'jms' appender
log4j.logger.org.apache.activemq=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %-5p %c - %m%n

## Configure 'jms' appender. You'll also need
## jndi.properties file in order to make it work
log4j.appender.jms=org.apache.log4j.net.JMSAppender
log4j.appender.jms.InitialContextFactoryName=
    org.apache.activemq.jndi.ActiveMQInitialContextFactory
log4j.appender.jms.ProviderURL=tcp://localhost:61616
log4j.appender.jms.TopicBindingName=logTopic
log4j.appender.jms.TopicConnectionFactoryBindingName=ConnectionFactory

Es importante tener en cuenta que no se esté logeando información de ActimeMQ con el JMSAppender, porque en otro caso nos arriesgamos a que se envíen mensajes sin que el sistema de colas esté arrancado. Para ello pasamos el log de ActiveMQ a otro appender diferente (en el ejemplo se puede observar como está asociado a la salida stdout).

Para que los recursos de ActiveMQ estén disponibles para Log4j tenemos que configurarlo mediante JNDI en un fichero jndi.properties de nuestra aplicación. Se puede partir del siguiente ejemplo (observar que en la página de ActiveMQ refieren un fichero de propiedades distinto, a mi no me funcionó, por lo que copio el que me funcionó a mi).


java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory

# use the following property to configure the default connector
java.naming.provider.url = vm://localhost

# register some queues in JNDI using the form
# queue.[jndiName] = [physicalName]
topic.logTopic = logTopic

Con estos pocos pasos hemos terminado, y ya tenemos configurado Log4j para que redireccione los mensajes de logging a colas JMS usando ActiveMQ como implementación de JMS.

Comentarios

Gregorio Mena ha dicho que…
Acabo de llegar al blog por casualidad, gracias a Google Reader, y a él va derechito para poder estar al día porque seguro que va a estar sobrado de calidad.
También pondré una referencia en el mío, para que tenga algo muy bueno, aunque sea referenciado ;)

Un abrazo.
Gregorio.
Yeray Darias ha dicho que…
Bueno Gregorio creo que sobreestimas un poco :) pero lo haré lo mejor que pueda para no defraudar.

Saludos.
Yeray.

Entradas populares de este blog

¿Cómo hacer uso de SASS en proyectos Java?

#informáticaSoluciónYA