Introducción
Mule es ESB (Enterprise Service Bus) Se usa para enviar/recibir mensajes heterogéneos entre diferentes productos/consumidores.
Admite muchos componentes de transporte y servicio como JMS, SOAP, JBI, BPEL, EJB, AS/400, HTTP, JDBC, TCP, UDP, SMTP, FILE, FTP y más.
Como en Internet el idioma padre es HTTP vamos a ver cómo hacer logging de las peticiones y respuestas HTTP que pasan por mule.
Log de HTTP con log4j
Vamos a suponer un caso sencillo, done una petición HTTP entrante produce una HTTP saliente.
En mule el flujo podría ser así:
No es el objetivo de esta entrada dar una clase de mule, basta decir que las bolas azules unas es un “HTTP Listener” que escucha los mensajes enviados a mule y un “HTTP Request” que se encarga de enviar peticiones HTTP desde mule a otra aplicación. Ambos compoenntes, necesitan de otro que no es gráfico que se llama “Configuration”.
Voy a suponer el caso que tengo una configuración para el listener que se llama HTTP_Listener_config y otra para el Request que se llama a su vez HTTP_Request_configuration. En este caso el fichero log4j.xml para observar un fichero de log y un log por consola sería algo así:
<?xml version="1.0" encoding="utf-8"?>
<Configuration>
<!--These are some of the loggers you can enable.
There are several more you can find in the documentation.
Besides this log4j configuration, you can also use Java VM environment variables
to enable other logs like network (-Djavax.net.debug=ssl or all) and
Garbage Collector (-XX:+PrintGC). These will be append to the console, so you will
see them in the mule_ee.log file. -->
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n"/>
</Console>
<RollingFile name="file" fileName="${sys:mule.home}${sys:file.separator}logs${sys:file.separator}say-hello-mule4-docker.log"
filePattern="${sys:mule.home}${sys:file.separator}logs${sys:file.separator}say-hello-mule4-docker-%i.log">
<PatternLayout pattern="%-5p %d [%t] %X{correlationId}%c: %m%n" />
<SizeBasedTriggeringPolicy size="10 MB" />
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<!-- Http Logger shows wire traffic on DEBUG. -->
<!--AsyncLogger name="org.mule.service.http.impl.service.HttpMessageLogger" level="DEBUG" /-->
<AsyncLogger name="org.mule.service.http" level="WARN"/>
<AsyncLogger name="org.mule.extension.http" level="WARN"/>
<!-- Mule classes -->
<AsyncLogger name="org.mule" level="INFO"/>
<AsyncLogger name="com.mulesoft" level="INFO"/>
<!-- debug config to log HTTP in/out messages -->
<AsyncLogger name="org.mule.service.http.impl.service.HttpMessageLogger.HTTP_Listener_config" level="DEBUG"/>
<AsyncLogger name="org.mule.service.http.impl.service.HttpMessageLogger.http.requester.HTTP_Request_configuration" level="DEBUG"/>
<AsyncLogger name="org.mule.service.http.impl.service.HttpMessageLogger.http.requester.HTTP_Request_configuration_with_token" level="DEBUG"/>
<AsyncRoot level="INFO">
<AppenderRef ref="Console"/>
<AppenderRef ref="file" />
</AsyncRoot>
</Loggers>
</Configuration>
Importante las líneas, donde vemos cómo se indica el package completo con el nombre de los componentes a activar su log.
<AsyncLogger name="org.mule.service.http.impl.service.HttpMessageLogger.HTTP_Listener_config" level="DEBUG"/>
<AsyncLogger name="org.mule.service.http.impl.service.HttpMessageLogger.http.requester.HTTP_Request_configuration" level="DEBUG"/>
<AsyncLogger name="org.mule.service.http.impl.service.HttpMessageLogger.http.requester.HTTP_Request_configuration_with_token" level="DEBUG"/>