Class ClassLoaderContextSelector

  • All Implemented Interfaces:
    ContextSelector, LoggerContextShutdownAware
    Direct Known Subclasses:
    AsyncLoggerContextSelector, BundleContextSelector

    public class ClassLoaderContextSelector
    extends java.lang.Object
    implements ContextSelector, LoggerContextShutdownAware
    This ContextSelector chooses a LoggerContext based upon the ClassLoader of the caller. This allows Loggers assigned to static variables to be released along with the classes that own then. Other ContextSelectors will generally cause Loggers associated with classes loaded from different ClassLoaders to be co-mingled. This is a problem if, for example, a web application is undeployed as some of the Loggers being released may be associated with a Class in a parent ClassLoader, which will generally have negative consequences. The main downside to this ContextSelector is that Configuration is more challenging. This ContextSelector should not be used with a Servlet Filter such as the Log4jServletFilter.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void contextShutdown​(LoggerContext loggerContext)  
      protected LoggerContext createContext​(java.lang.String name, java.net.URI configLocation)  
      protected java.lang.String defaultContextName()  
      private LoggerContext findContext​(java.lang.ClassLoader loaderOrNull)  
      LoggerContext getContext​(java.lang.String fqcn, java.lang.ClassLoader loader, boolean currentContext)
      Returns the LoggerContext.
      LoggerContext getContext​(java.lang.String fqcn, java.lang.ClassLoader loader, boolean currentContext, java.net.URI configLocation)
      Returns the LoggerContext.
      LoggerContext getContext​(java.lang.String fqcn, java.lang.ClassLoader loader, java.util.Map.Entry<java.lang.String,​java.lang.Object> entry, boolean currentContext, java.net.URI configLocation)
      Returns the LoggerContext.
      protected LoggerContext getDefault()  
      java.util.List<LoggerContext> getLoggerContexts()
      Returns a List of all the available LoggerContexts.
      boolean hasContext​(java.lang.String fqcn, java.lang.ClassLoader loader, boolean currentContext)
      Checks to see if a LoggerContext is installed.
      boolean isClassLoaderDependent()
      Determines whether or not this ContextSelector depends on the callers classloader.
      private LoggerContext locateContext​(java.lang.ClassLoader loaderOrNull, java.util.Map.Entry<java.lang.String,​java.lang.Object> entry, java.net.URI configLocation)  
      void removeContext​(LoggerContext context)
      Remove any references to the LoggerContext.
      void shutdown​(java.lang.String fqcn, java.lang.ClassLoader loader, boolean currentContext, boolean allContexts)
      Shuts down the LoggerContext.
      protected java.lang.String toContextMapKey​(java.lang.ClassLoader loader)  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • DEFAULT_CONTEXT

        private static final java.util.concurrent.atomic.AtomicReference<LoggerContext> DEFAULT_CONTEXT
      • CONTEXT_MAP

        protected static final java.util.concurrent.ConcurrentMap<java.lang.String,​java.util.concurrent.atomic.AtomicReference<java.lang.ref.WeakReference<LoggerContext>>> CONTEXT_MAP
    • Constructor Detail

      • ClassLoaderContextSelector

        public ClassLoaderContextSelector()
    • Method Detail

      • shutdown

        public void shutdown​(java.lang.String fqcn,
                             java.lang.ClassLoader loader,
                             boolean currentContext,
                             boolean allContexts)
        Description copied from interface: ContextSelector
        Shuts down the LoggerContext.
        Specified by:
        shutdown in interface ContextSelector
        Parameters:
        fqcn - The fully qualified class name of the caller.
        loader - The ClassLoader to use or null.
        currentContext - If true returns the current Context, if false returns the Context appropriate
        allContexts - if true all LoggerContexts that can be located will be shutdown.
      • hasContext

        public boolean hasContext​(java.lang.String fqcn,
                                  java.lang.ClassLoader loader,
                                  boolean currentContext)
        Description copied from interface: ContextSelector
        Checks to see if a LoggerContext is installed. The default implementation returns false.
        Specified by:
        hasContext in interface ContextSelector
        Parameters:
        fqcn - The fully qualified class name of the caller.
        loader - The ClassLoader to use or null.
        currentContext - If true returns the current Context, if false returns the Context appropriate for the caller if a more appropriate Context can be determined.
        Returns:
        true if a LoggerContext has been installed, false otherwise.
      • findContext

        private LoggerContext findContext​(java.lang.ClassLoader loaderOrNull)
      • getContext

        public LoggerContext getContext​(java.lang.String fqcn,
                                        java.lang.ClassLoader loader,
                                        boolean currentContext)
        Description copied from interface: ContextSelector
        Returns the LoggerContext.
        Specified by:
        getContext in interface ContextSelector
        Parameters:
        fqcn - The fully qualified class name of the caller.
        loader - ClassLoader to use or null.
        currentContext - If true returns the current Context, if false returns the Context appropriate for the caller if a more appropriate Context can be determined.
        Returns:
        The LoggerContext.
      • getContext

        public LoggerContext getContext​(java.lang.String fqcn,
                                        java.lang.ClassLoader loader,
                                        boolean currentContext,
                                        java.net.URI configLocation)
        Description copied from interface: ContextSelector
        Returns the LoggerContext.
        Specified by:
        getContext in interface ContextSelector
        Parameters:
        fqcn - The fully qualified class name of the caller.
        loader - ClassLoader to use or null.
        currentContext - If true returns the current Context, if false returns the Context appropriate for the caller if a more appropriate Context can be determined.
        configLocation - The location of the configuration for the LoggerContext.
        Returns:
        The LoggerContext.
      • getContext

        public LoggerContext getContext​(java.lang.String fqcn,
                                        java.lang.ClassLoader loader,
                                        java.util.Map.Entry<java.lang.String,​java.lang.Object> entry,
                                        boolean currentContext,
                                        java.net.URI configLocation)
        Description copied from interface: ContextSelector
        Returns the LoggerContext.
        Specified by:
        getContext in interface ContextSelector
        Parameters:
        fqcn - The fully qualified class name of the caller.
        loader - ClassLoader to use or null.
        currentContext - If true returns the current Context, if false returns the Context appropriate for the caller if a more appropriate Context can be determined.
        configLocation - The location of the configuration for the LoggerContext.
        Returns:
        The LoggerContext.
      • isClassLoaderDependent

        public boolean isClassLoaderDependent()
        Description copied from interface: ContextSelector
        Determines whether or not this ContextSelector depends on the callers classloader. This method should be overridden by implementations, however a default method is provided which always returns true to preserve the old behavior.
        Specified by:
        isClassLoaderDependent in interface ContextSelector
        Returns:
        true if the class loader is required.
      • locateContext

        private LoggerContext locateContext​(java.lang.ClassLoader loaderOrNull,
                                            java.util.Map.Entry<java.lang.String,​java.lang.Object> entry,
                                            java.net.URI configLocation)
      • createContext

        protected LoggerContext createContext​(java.lang.String name,
                                              java.net.URI configLocation)
      • toContextMapKey

        protected java.lang.String toContextMapKey​(java.lang.ClassLoader loader)
      • defaultContextName

        protected java.lang.String defaultContextName()