martes, 2 de septiembre de 2014

WSO2 ESB y el manejo de los logs para la detección de errores

En esta entrada quisieramos mostrarles algo que es básico en cualquier suite para desarrollar soluciones de integración y es la forma en que capturamos los logs generados por los eventos que ocurren con los servicios desplegados.

En el WSO2 ESB existen 3 formas de capturar los logs de los servicios proxy:

  1. Usando el mediador log, dentro de la misma configuración del servicio proxy, algo muy útil durante el desarrollo y para los temas de troubleshooting.
  2. Generando los logs propios del servicio proxy en un fichero a parte del de los logs del propio ESB. A veces dada la cantidad de logs generados se hace un poco complicado seguirle la traza a lo que ocurre con determinado servicio. Esto es muy útil en los ambientes de producción.
  3. Extendiendo las funcionalidades del Synapse, framework base del WSO2 ESB, para incluir lo que se conoce como Observadores. Los cuales se programan para capturar la información que querramos y son adjuntados al servicio proxy en cuestión, especificando incluso el fichero de salida hacia donde se escribirán los logs.

Veamos ahora como podemos usar cada una de estas formas. Para ello usaremos el servicio JAX-WS desplegado en el WSO2 AS de la entrada anterior  y crearemos un servicio proxy.

El servicio JAX-WS lo pueden ver en la siguiente imagen:



El servicio proxy que creamos para la primera forma de captura de los logs lo pueden ver en la siguiente imagen.



Así los logs capturados se pueden ver en la consola o en el fichero de los logs en el ESB, como se muestra en la siguiente imagen.



La segunda forma de capturar los logs, aunque sería mejor decir que es de separar los logs que nos interesan de los logs propios de la ejecución del ESB, es modificar el fichero log4j.properties y añadir las siguientes líneas:

# Configuracion de appender para capturar los logs generados por el servicio UserCollectionProxy
log4j.category.SERVICE_LOGGER.UserCollectionProxy=INFO, PROXY_APPENDER
log4j.additivity.PROXY_APPENDER=false
log4j.appender.PROXY_APPENDER=org.apache.log4j.DailyRollingFileAppender
log4j.appender.PROXY_APPENDER.File=${carbon.home}/repository/logs/${instance.log}/wso2-esb-UserCollectionProxy${instance.log}.log
log4j.appender.PROXY_APPENDER.Append=true
log4j.appender.PROXY_APPENDER.layout=org.apache.log4j.PatternLayout
log4j.appender.PROXY_APPENDER.layout.ConversionPattern=%d{HH:mm:ss,SSS} [%X{ip}-%X{host}] [%t] %5p %c{1} %m%


De esta manera se creará un fichero de nombre wso2-esb-UserCollectionProxy.log que tendrá los logs generados solo por el servicio proxy indicado.

La tercera variante es una implementación más general de la segunda. En la variante 2 para cada servicio debíamos realizar una modificación en el fichero log4j.properties y esto es conveniente cuando no nos interesa observar los logs de todos los servicios si no de algunos en particular. Pero cuando nos interesa observar los logs de todos los servicios, entonces la 3ra opción es la mejor.

Básicamente consiste en implementar un observer que extiende de la clase AbstractSynapseObserver de synapse y posee un método: private void setLogger(ProxyService proxy) throws IOException

Este método es donde se implementa el comportamiento tal y como se puede observar en la siguiente clase java.



package org.jorgesoftdev;

import org.apache.synapse.config.AbstractSynapseObserver;
import org.apache.synapse.core.axis2.ProxyService;
import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.IOException;

/**
 * Created by Jorge on 30/08/14.
 */
public class CustomSynapseObserverForLogging extends AbstractSynapseObserver  {

    private static final Log log = LogFactory.getLog(CustomSynapseObserverForLogging.class);

    public void proxyServiceAdded(ProxyService proxy) {
        try {
            setLogger(proxy);
        } catch (IOException e) {
            log.error("CustomProxyObserver could not set service level logger for the proxy : " + proxy.getName(), e);
        }
    }

    public void proxyServiceRemoved(ProxyService proxy) {
        try {
            setLogger(proxy);
        } catch (IOException e) {
            log.error("CustomProxyObserver could not set service level logger for the proxy : " + proxy.getName(), e);
        }
    }

    private void setLogger(ProxyService proxy) throws IOException {
        String filename = "repository/logs/" + proxy.getName() + ".log";
        String datePattern = "yyyy-MM-dd";
        String SYSTEM_LOG_PATTERN = "[%d] %5p - %x %m {%c}%n";
        PatternLayout layout = new PatternLayout(SYSTEM_LOG_PATTERN);
        DailyRollingFileAppender appender = null;
        appender = new DailyRollingFileAppender(layout, filename, datePattern);
        Logger proxyLogger = Logger.getLogger("SERVICE_LOGGER." + proxy.getName());
        proxyLogger.setLevel(Level.ALL);
        proxyLogger.setAdditivity(false);
        proxyLogger.addAppender(appender);
    }

}




Para implementar la tercera variante he creado un proyecto maven con esta clase implementada, he generado el jar y lo he copiado en la carpeta [ESB_HOME]\repository\components\lib\

Luego he ido al fichero [ESB_HOME]\repository\conf\synapse.properties y he actualizado la línea:
synapse.observers=org.wso2.carbon.mediation.dependency.mgt.DependencyTracker

con la línea:

synapse.observers=org.jorgesoftdev.CustomSynapseObserverForLogging

Luego de reiniciar el servidor en el directorio [ESB_HOME]\repository\logs\ aparecen los ficheros [nombre_servicio_proxy].log con los logs de los respectivos servicios, cada uno por separado.


Cada variante depende de las necesidades de los desarrolladores,  del ambiente en el que se esté ejecutando el ESB, pero al menos a nuestro equipo para un ambiente de desarrollo una combinación de las variantes 1 y 3 es la mejor opción.

La información utilizada para esta entrada fue obtenida de aquí.

Esperamos les sea de utilidad.

2 comentarios:

  1. Hola.
    Una duda, se creara un archivo de logs cada que se ejecute un proxy o sera un archivo de logs por proyecto ?

    ResponderEliminar