/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.api.processor; import static org.mule.runtime.core.api.util.StreamingUtils.withCursoredEvent; import org.mule.runtime.api.exception.MuleException; import org.mule.runtime.api.lifecycle.Initialisable; import org.mule.runtime.api.lifecycle.InitialisationException; import org.mule.runtime.api.meta.AbstractAnnotatedObject; import org.mule.runtime.core.api.Event; import org.mule.runtime.core.api.MuleContext; import org.mule.runtime.core.api.construct.FlowConstruct; import org.mule.runtime.core.api.construct.FlowConstructAware; import org.mule.runtime.core.api.context.MuleContextAware; import org.mule.runtime.core.api.el.ExtendedExpressionManager; import org.mule.runtime.core.util.StringUtils; import org.apache.log4j.Level; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * MessageProcessor implementation that logs the current element of a value evaluated from it using an expression evaluator. By * default the current messages is logged using the {@link Level#DEBUG} level to the * 'org.mule.runtime.core.api.processor.LoggerMessageProcessor' category. The level and category can both be configured to suit * your needs. */ public class LoggerMessageProcessor extends AbstractAnnotatedObject implements Processor, Initialisable, MuleContextAware, FlowConstructAware { protected transient Logger logger; protected String message; protected String category; protected String level = "DEBUG"; protected MuleContext muleContext; protected FlowConstruct flowConstruct; protected ExtendedExpressionManager expressionManager; @Override public void initialise() throws InitialisationException { initLogger(); expressionManager = muleContext.getExpressionManager(); } protected void initLogger() { if (category != null) { logger = LoggerFactory.getLogger(category); } else { logger = LoggerFactory.getLogger(LoggerMessageProcessor.class); } } @Override public Event process(Event event) throws MuleException { return withCursoredEvent(event, cursored -> { log(event); return event; }); } protected void log(Event event) { if (event == null) { logWithLevel(null); } else { if (StringUtils.isEmpty(message)) { logWithLevel(event.getMessage()); } else { LogLevel logLevel = LogLevel.valueOf(level); if (LogLevel.valueOf(level).isEnabled(logger)) { logLevel.log(logger, expressionManager.parse(message, event, flowConstruct)); } } } } protected void logWithLevel(Object object) { LogLevel logLevel = LogLevel.valueOf(level); if (logLevel.isEnabled(logger)) { logLevel.log(logger, object); } } @Override public void setMuleContext(MuleContext muleContext) { this.muleContext = muleContext; } @Override public void setFlowConstruct(FlowConstruct flowConstruct) { this.flowConstruct = flowConstruct; } public void setMessage(String message) { this.message = message; } public void setCategory(String category) { this.category = category; } public void setLevel(String level) { this.level = level.toUpperCase(); } public enum LogLevel { ERROR { @Override public void log(Logger logger, Object object) { logger.error(object == null ? null : object.toString()); } @Override public boolean isEnabled(Logger logger) { return logger.isErrorEnabled(); } }, WARN { @Override public void log(Logger logger, Object object) { logger.warn(object == null ? null : object.toString()); } @Override public boolean isEnabled(Logger logger) { return logger.isWarnEnabled(); } }, INFO { @Override public void log(Logger logger, Object object) { logger.info(object == null ? null : object.toString()); } @Override public boolean isEnabled(Logger logger) { return logger.isInfoEnabled(); } }, DEBUG { @Override public void log(Logger logger, Object object) { logger.debug(object == null ? null : object.toString()); } @Override public boolean isEnabled(Logger logger) { return logger.isDebugEnabled(); } }, TRACE { @Override public void log(Logger logger, Object object) { logger.trace(object == null ? null : object.toString()); } @Override public boolean isEnabled(Logger logger) { return logger.isTraceEnabled(); } }; public abstract void log(Logger logger, Object object); public abstract boolean isEnabled(Logger logger); } }