All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mule.runtime.module.launcher.log4j2.DispatchingLogger Maven / Gradle / Ivy

There is a newer version: 4.1.1
Show newest version
/*
 * 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.module.launcher.log4j2;

import static org.mule.runtime.module.launcher.log4j2.ArtifactAwareContextSelector.resolveLoggerContextClassLoader;
import static org.reflections.ReflectionUtils.getAllMethods;
import static org.reflections.ReflectionUtils.withName;
import static org.reflections.ReflectionUtils.withParameters;

import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.selector.ContextSelector;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.MessageFactory;
import org.apache.logging.log4j.spi.AbstractLogger;
import org.apache.logging.log4j.spi.ExtendedLogger;

/**
 * Suppose that class X is used in applications Y and Z. If X holds a static reference to a logger L, then all the log events are
 * going to be added into the context {@link org.apache.logging.log4j.core.LoggerContext} on which L fast first initialized,
 * regardless of which application generated the event.
 * 

* This class is a wrapper for {@link org.apache.logging.log4j.core.Logger} class which is capable of detecting that the log event * is being generated from an application which {@link org.apache.logging.log4j.core.LoggerContext} is different than L's, and * thus forward the event to the correct context. *

* Because this class is a fix for issues in static loggers, it must not hold any reference to any {@link java.lang.ClassLoader} * since otherwise that class loader would be GC unreachable. For that reason, it uses {@link #ownerClassLoaderHash} instead of * the real reference * * @since 3.6.0 */ abstract class DispatchingLogger extends Logger { private final Logger originalLogger; private Method updateConfigurationMethod = null; private final ContextSelector contextSelector; private final int ownerClassLoaderHash; DispatchingLogger(Logger originalLogger, int ownerClassLoaderHash, LoggerContext loggerContext, ContextSelector contextSelector, MessageFactory messageFactory) { super(loggerContext, originalLogger.getName(), messageFactory); this.originalLogger = originalLogger; this.contextSelector = contextSelector; this.ownerClassLoaderHash = ownerClassLoaderHash; } private Logger getLogger() { final ClassLoader currentClassLoader = resolveLoggerContextClassLoader(Thread.currentThread().getContextClassLoader()); if (useThisLoggerContextClassLoader(currentClassLoader)) { return originalLogger; } // trick - this is probably a logger declared in a static field // the classloader used to create it and the TCCL can be different // ask contextSelector for the correct context return contextSelector.getContext(getName(), currentClassLoader, true).getLogger(getName(), getMessageFactory()); } /** * @param currentClassLoader execution classloader of the logging operation * @return true if the logger context associated with this instance must be used for logging, false if we still need to continue * searching for the right logger context */ private boolean useThisLoggerContextClassLoader(ClassLoader currentClassLoader) { return currentClassLoader.hashCode() == ownerClassLoaderHash; } /** * This is workaround for the low visibility of the {@link Logger#updateConfiguration(Configuration)} method, which invokes it * on the {@code originalLogger}. * * Using a wrapper in the log4j package causes an {@link IllegalAccessError}. * * @param config */ @Override protected void updateConfiguration(final Configuration config) { if (lookupUpdateConfigurationMethod()) { try { updateConfigurationMethod.invoke(originalLogger, config); } catch (Exception e) { throw new RuntimeException(e); } } } private boolean lookupUpdateConfigurationMethod() { if (updateConfigurationMethod == null) { Collection candidateMethods = getAllMethods(originalLogger.getClass(), withName("updateConfiguration"), withParameters(Configuration.class)); if (candidateMethods.size() == 1) { updateConfigurationMethod = candidateMethods.iterator().next(); updateConfigurationMethod.setAccessible(true); } } return updateConfigurationMethod != null; } @Override public MessageFactory getMessageFactory() { return originalLogger.getMessageFactory(); } @Override public Logger getParent() { return getLogger().getParent(); } @Override public LoggerContext getContext() { return getLogger().getContext(); } @Override public void setLevel(Level level) { getLogger().setLevel(level); } @Override public void logMessage(String fqcn, Level level, Marker marker, Message message, Throwable t) { getLogger().logMessage(fqcn, level, marker, message, t); } @Override public boolean isEnabled(Level level, Marker marker, String message, Throwable t) { return getLogger().isEnabled(level, marker, message, t); } @Override public boolean isEnabled(Level level, Marker marker, String message) { return getLogger().isEnabled(level, marker, message); } @Override public boolean isEnabled(Level level, Marker marker, String message, Object... params) { return getLogger().isEnabled(level, marker, message, params); } @Override public boolean isEnabled(Level level, Marker marker, Object message, Throwable t) { return getLogger().isEnabled(level, marker, message, t); } @Override public boolean isEnabled(Level level, Marker marker, Message message, Throwable t) { return getLogger().isEnabled(level, marker, message, t); } @Override public void addAppender(Appender appender) { getLogger().addAppender(appender); } @Override public void removeAppender(Appender appender) { getLogger().removeAppender(appender); } @Override public Map getAppenders() { return getLogger().getAppenders(); } @Override public Iterator getFilters() { return getLogger().getFilters(); } @Override public Level getLevel() { return getLogger().getLevel(); } @Override public int filterCount() { return getLogger().filterCount(); } @Override public void addFilter(Filter filter) { getLogger().addFilter(filter); } @Override public boolean isAdditive() { return getLogger().isAdditive(); } @Override public void setAdditive(boolean additive) { getLogger().setAdditive(additive); } @Override public String toString() { return getLogger().toString(); } public static void checkMessageFactory(ExtendedLogger logger, MessageFactory messageFactory) { AbstractLogger.checkMessageFactory(logger, messageFactory); } @Override public void catching(Level level, Throwable t) { getLogger().catching(level, t); } @Override public void catching(Throwable t) { getLogger().catching(t); } @Override public void debug(Marker marker, Message msg) { getLogger().debug(marker, msg); } @Override public void debug(Marker marker, Message msg, Throwable t) { getLogger().debug(marker, msg, t); } @Override public void debug(Marker marker, Object message) { getLogger().debug(marker, message); } @Override public void debug(Marker marker, Object message, Throwable t) { getLogger().debug(marker, message, t); } @Override public void debug(Marker marker, String message) { getLogger().debug(marker, message); } @Override public void debug(Marker marker, String message, Object... params) { getLogger().debug(marker, message, params); } @Override public void debug(Marker marker, String message, Throwable t) { getLogger().debug(marker, message, t); } @Override public void debug(Message msg) { getLogger().debug(msg); } @Override public void debug(Message msg, Throwable t) { getLogger().debug(msg, t); } @Override public void debug(Object message) { getLogger().debug(message); } @Override public void debug(Object message, Throwable t) { getLogger().debug(message, t); } @Override public void debug(String message) { getLogger().debug(message); } @Override public void debug(String message, Object... params) { getLogger().debug(message, params); } @Override public void debug(String message, Throwable t) { getLogger().debug(message, t); } @Override public void entry() { getLogger().entry(); } @Override public void entry(Object... params) { getLogger().entry(params); } @Override public void entry(String fqcn, Object... params) { getLogger().entry(fqcn, params); } @Override public void error(Marker marker, Message msg) { getLogger().error(marker, msg); } @Override public void error(Marker marker, Message msg, Throwable t) { getLogger().error(marker, msg, t); } @Override public void error(Marker marker, Object message) { getLogger().error(marker, message); } @Override public void error(Marker marker, Object message, Throwable t) { getLogger().error(marker, message, t); } @Override public void error(Marker marker, String message) { getLogger().error(marker, message); } @Override public void error(Marker marker, String message, Object... params) { getLogger().error(marker, message, params); } @Override public void error(Marker marker, String message, Throwable t) { getLogger().error(marker, message, t); } @Override public void error(Message msg) { getLogger().error(msg); } @Override public void error(Message msg, Throwable t) { getLogger().error(msg, t); } @Override public void error(Object message) { getLogger().error(message); } @Override public void error(Object message, Throwable t) { getLogger().error(message, t); } @Override public void error(String message) { getLogger().error(message); } @Override public void error(String message, Object... params) { getLogger().error(message, params); } @Override public void error(String message, Throwable t) { getLogger().error(message, t); } @Override public void exit() { getLogger().exit(); } @Override public R exit(R result) { return getLogger().exit(result); } @Override public void fatal(Marker marker, Message msg) { getLogger().fatal(marker, msg); } @Override public void fatal(Marker marker, Message msg, Throwable t) { getLogger().fatal(marker, msg, t); } @Override public void fatal(Marker marker, Object message) { getLogger().fatal(marker, message); } @Override public void fatal(Marker marker, Object message, Throwable t) { getLogger().fatal(marker, message, t); } @Override public void fatal(Marker marker, String message) { getLogger().fatal(marker, message); } @Override public void fatal(Marker marker, String message, Object... params) { getLogger().fatal(marker, message, params); } @Override public void fatal(Marker marker, String message, Throwable t) { getLogger().fatal(marker, message, t); } @Override public void fatal(Message msg) { getLogger().fatal(msg); } @Override public void fatal(Message msg, Throwable t) { getLogger().fatal(msg, t); } @Override public void fatal(Object message) { getLogger().fatal(message); } @Override public void fatal(Object message, Throwable t) { getLogger().fatal(message, t); } @Override public void fatal(String message) { getLogger().fatal(message); } @Override public void fatal(String message, Object... params) { getLogger().fatal(message, params); } @Override public void fatal(String message, Throwable t) { getLogger().fatal(message, t); } @Override public void info(Marker marker, Message msg) { getLogger().info(marker, msg); } @Override public void info(Marker marker, Message msg, Throwable t) { getLogger().info(marker, msg, t); } @Override public void info(Marker marker, Object message) { getLogger().info(marker, message); } @Override public void info(Marker marker, Object message, Throwable t) { getLogger().info(marker, message, t); } @Override public void info(Marker marker, String message) { getLogger().info(marker, message); } @Override public void info(Marker marker, String message, Object... params) { getLogger().info(marker, message, params); } @Override public void info(Marker marker, String message, Throwable t) { getLogger().info(marker, message, t); } @Override public void info(Message msg) { getLogger().info(msg); } @Override public void info(Message msg, Throwable t) { getLogger().info(msg, t); } @Override public void info(Object message) { getLogger().info(message); } @Override public void info(Object message, Throwable t) { getLogger().info(message, t); } @Override public void info(String message) { getLogger().info(message); } @Override public void info(String message, Object... params) { getLogger().info(message, params); } @Override public void info(String message, Throwable t) { getLogger().info(message, t); } @Override public boolean isDebugEnabled() { return getLogger().isDebugEnabled(); } @Override public boolean isDebugEnabled(Marker marker) { return getLogger().isDebugEnabled(marker); } @Override public boolean isEnabled(Level level) { return getLogger().isEnabled(level); } @Override public boolean isEnabled(Level level, Marker marker) { return getLogger().isEnabled(level, marker); } @Override public boolean isErrorEnabled() { return getLogger().isErrorEnabled(); } @Override public boolean isErrorEnabled(Marker marker) { return getLogger().isErrorEnabled(marker); } @Override public boolean isFatalEnabled() { return getLogger().isFatalEnabled(); } @Override public boolean isFatalEnabled(Marker marker) { return getLogger().isFatalEnabled(marker); } @Override public boolean isInfoEnabled() { return getLogger().isInfoEnabled(); } @Override public boolean isInfoEnabled(Marker marker) { return getLogger().isInfoEnabled(marker); } @Override public boolean isTraceEnabled() { return getLogger().isTraceEnabled(); } @Override public boolean isTraceEnabled(Marker marker) { return getLogger().isTraceEnabled(marker); } @Override public boolean isWarnEnabled() { return getLogger().isWarnEnabled(); } @Override public boolean isWarnEnabled(Marker marker) { return getLogger().isWarnEnabled(marker); } @Override public void log(Level level, Marker marker, Message msg) { getLogger().log(level, marker, msg); } @Override public void log(Level level, Marker marker, Message msg, Throwable t) { getLogger().log(level, marker, msg, t); } @Override public void log(Level level, Marker marker, Object message) { getLogger().log(level, marker, message); } @Override public void log(Level level, Marker marker, Object message, Throwable t) { getLogger().log(level, marker, message, t); } @Override public void log(Level level, Marker marker, String message) { getLogger().log(level, marker, message); } @Override public void log(Level level, Marker marker, String message, Object... params) { getLogger().log(level, marker, message, params); } @Override public void log(Level level, Marker marker, String message, Throwable t) { getLogger().log(level, marker, message, t); } @Override public void log(Level level, Message msg) { getLogger().log(level, msg); } @Override public void log(Level level, Message msg, Throwable t) { getLogger().log(level, msg, t); } @Override public void log(Level level, Object message) { getLogger().log(level, message); } @Override public void log(Level level, Object message, Throwable t) { getLogger().log(level, message, t); } @Override public void log(Level level, String message) { getLogger().log(level, message); } @Override public void log(Level level, String message, Object... params) { getLogger().log(level, message, params); } @Override public void log(Level level, String message, Throwable t) { getLogger().log(level, message, t); } @Override public void logIfEnabled(String fqcn, Level level, Marker marker, Message msg, Throwable t) { getLogger().logIfEnabled(fqcn, level, marker, msg, t); } @Override public void logIfEnabled(String fqcn, Level level, Marker marker, Object message, Throwable t) { getLogger().logIfEnabled(fqcn, level, marker, message, t); } @Override public void logIfEnabled(String fqcn, Level level, Marker marker, String message) { getLogger().logIfEnabled(fqcn, level, marker, message); } @Override public void logIfEnabled(String fqcn, Level level, Marker marker, String message, Object... params) { getLogger().logIfEnabled(fqcn, level, marker, message, params); } @Override public void logIfEnabled(String fqcn, Level level, Marker marker, String message, Throwable t) { getLogger().logIfEnabled(fqcn, level, marker, message, t); } @Override public void printf(Level level, Marker marker, String format, Object... params) { getLogger().printf(level, marker, format, params); } @Override public void printf(Level level, String format, Object... params) { getLogger().printf(level, format, params); } @Override public T throwing(T t) { return getLogger().throwing(t); } @Override public T throwing(Level level, T t) { return getLogger().throwing(level, t); } @Override public void trace(Marker marker, Message msg) { getLogger().trace(marker, msg); } @Override public void trace(Marker marker, Message msg, Throwable t) { getLogger().trace(marker, msg, t); } @Override public void trace(Marker marker, Object message) { getLogger().trace(marker, message); } @Override public void trace(Marker marker, Object message, Throwable t) { getLogger().trace(marker, message, t); } @Override public void trace(Marker marker, String message) { getLogger().trace(marker, message); } @Override public void trace(Marker marker, String message, Object... params) { getLogger().trace(marker, message, params); } @Override public void trace(Marker marker, String message, Throwable t) { getLogger().trace(marker, message, t); } @Override public void trace(Message msg) { getLogger().trace(msg); } @Override public void trace(Message msg, Throwable t) { getLogger().trace(msg, t); } @Override public void trace(Object message) { getLogger().trace(message); } @Override public void trace(Object message, Throwable t) { getLogger().trace(message, t); } @Override public void trace(String message) { getLogger().trace(message); } @Override public void trace(String message, Object... params) { getLogger().trace(message, params); } @Override public void trace(String message, Throwable t) { getLogger().trace(message, t); } @Override public void warn(Marker marker, Message msg) { getLogger().warn(marker, msg); } @Override public void warn(Marker marker, Message msg, Throwable t) { getLogger().warn(marker, msg, t); } @Override public void warn(Marker marker, Object message) { getLogger().warn(marker, message); } @Override public void warn(Marker marker, Object message, Throwable t) { getLogger().warn(marker, message, t); } @Override public void warn(Marker marker, String message) { getLogger().warn(marker, message); } @Override public void warn(Marker marker, String message, Object... params) { getLogger().warn(marker, message, params); } @Override public void warn(Marker marker, String message, Throwable t) { getLogger().warn(marker, message, t); } @Override public void warn(Message msg) { getLogger().warn(msg); } @Override public void warn(Message msg, Throwable t) { getLogger().warn(msg, t); } @Override public void warn(Object message) { getLogger().warn(message); } @Override public void warn(Object message, Throwable t) { getLogger().warn(message, t); } @Override public void warn(String message) { getLogger().warn(message); } @Override public void warn(String message, Object... params) { getLogger().warn(message, params); } @Override public void warn(String message, Throwable t) { getLogger().warn(message, t); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy