I have no idea where best to post this question , so I'll post it here.

I have multiple applications running on one appserver instance.  Each one of 
these requires its own log4j config.  To accomplish this, I've subclassed 
RepositorySelector as below to be able to use different configs for different 
contexts.

I'm trying to enable dynamic reloading of the log4j config.  Log4j supposedly 
supports this with the Configurator.configureAndWatch() method.  However, the 
API is not available for DOM objects coupled with the RepositorySelector 
extension.  So, I exposed the config loading code to a servlet call (not very 
secure, but sufficient for the immediate term).

Here's the problem.  When the config info is reloaded, it does not actually 
replace the old config in the jboss memory structures.  So, where is the log4j 
config being stored in jboss?  Is it a bug that its not replacing the config?  
If not, is there a facility for getting around this, or even a suggested hack?

Thanks for your help.



/**
 * This RepositorySelector is for use with web applications.  It assumes that
 * your log4j.xml file is in the WEB-INF directory.
 * 
 * The essentials are that this RepositorySelector replaces the standard one. 
This one maintains
 * a hashmap of LoggerRepositories keyed by context ClassLoader.  Each web app 
should have
 * a different ClassLoader.  If the classloader asking for a repository is not 
one of the ones 
 * stored in the hashmap, then the std default jboss one is returned.
 *
 * @author  Stan Silvert (original)
 */
public class RDRepositorySelector implements RepositorySelector
{
   private static boolean initialized = false;
   private static Object guard = new Object();
   
   private static Map repositories = new HashMap();
   private static LoggerRepository defaultRepository;

   /**
    * Register your web-app with this repository selector.
    */
   public static synchronized void init(ServletConfig config) 
        throws ServletException {

      loadLog4j(config.getServletContext());
   }
   
   public static void loadLog4j (ServletContext ctx) throws ServletException {
       if( !initialized ) // set the global RepositorySelector
       {
          defaultRepository = LogManager.getLoggerRepository();
          RepositorySelector theSelector = new RDRepositorySelector();
          LogManager.setRepositorySelector(theSelector, guard);
          initialized = true;
       }
       Hierarchy hierarchy = new Hierarchy(new RootCategory(Level.DEBUG));
       loadLog4JConfig(ctx, hierarchy);
       ClassLoader loader = Thread.currentThread().getContextClassLoader();
       repositories.put(loader, hierarchy);
   }

   // load log4j.xml from WEB-INF
   private static void loadLog4JConfig(ServletContext ctx, 
                                       Hierarchy hierarchy) 
                                            throws ServletException {
        try {
            String log4jFile = "/WEB-INF/log4j.xml";
            
//                        Original method of getting stream as 
ByteArrayInputStream            
//            InputStream log4JConfig = 
//                ctx.getResourceAsStream(log4jFile);
            
            // Getting InputStream from file directly instead of thru resource 
loader.
            String log4jPath = ctx.getRealPath(log4jFile);
            InputStream log4JConfig =
                new FileInputStream(log4jPath);
            
            Document doc = DocumentBuilderFactory.newInstance()
                                                 .newDocumentBuilder()
                                                 .parse(log4JConfig);
            DOMConfigurator conf = new DOMConfigurator();
            conf.doConfigure(doc.getDocumentElement(), hierarchy);
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }

   private RDRepositorySelector() {
   }

   public LoggerRepository getLoggerRepository() {
      ClassLoader loader = Thread.currentThread().getContextClassLoader();
      
      // get repository from hashmap
      LoggerRepository repository = (LoggerRepository)repositories.get(loader);
      
      if (repository == null) {
          return defaultRepository;
      } else {
          return repository;
      }
   }
}

View the original post : 
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=3873577#3873577

Reply to the post : 
http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=3873577


-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
JBoss-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jboss-user

Reply via email to