I don't have much time to respond, but there already exists implementations of
repository selectors in the latest Log4j CVS (ContextJNDIRepositorySelector) and
in the latest Log4j sandbox CVS (ContextClassLoaderSelector).  I added lots of
instructions to them.  Also look in InitShutdownController (in Log4j sandbox) to
see how I initialize the repository selector.  See more here...

http://nagoya.apache.org/wiki/apachewiki.cgi?Log4JProjectPages/AppContainerLogging


Jake

Quoting Vance Karimi <[EMAIL PROTECTED]>:

> Hi
> I am writing a container server application that runs services/contexts
> within it.  These services are hot deployed in a jar file and I manage the
> ClassLoaders to handle separate contexts.  I need to implement the
> repository selector in Log4j so each thread that runs a service logs to a
> separate log file.
> 
> Based on the following http://www.qos.ch/logging/sc.html I have a Repository
> Selector something very similar to:
> 
> 
> import org.apache.log4j.spi.RepositorySelector;
> import org.apache.log4j.spi.LoggerRepository;
> import org.apache.log4j.spi.RootCategory;
> import org.apache.log4j.Hierarchy;
> import org.apache.log4j.Level;
> import java.util.Hashtable;
> 
> public class CRS implements RepositorySelector {
> 
>   // key: current thread's ContextClassLoader,
>   // value: Hierarchy instance
>   private Hashtable ht;
> 
>   public CRS() {
>    ht = new Hashtable();
>   }
> 
>   public LoggerRepository getLoggerRepository() {
>     LoggerRepository loggerRepository = null;
> 
>     ClassLoader classLoader =
> Thread.currentThread().getContextClassLoader();
> 
>     loggerRepository = (LoggerRepository)
> loggerRepositories.get(classLoader.toString());
> 
>     if (loggerRepository != null) {
>                       // do nothing
>     } else {
>       loggerRepository = new Hierarchy(new RootCategory((Level)
> Level.DEBUG));
>       loadRepository(loggerRepository);
>       loggerRepositories.put(classLoader.toString(), loggerRepository);
> 
>     }
> 
>     return loggerRepository;
>   }
> 
>   /**
>    * The Container should remove the entry when the web-application
>    * is removed or restarted.
>    * */
>   public void remove(ClassLoader cl) {
>     if (loggerRepositories.containsKey(cl.toString())) {
>       LoggerRepository lr = (LoggerRepository)
> loggerRepositories.get(cl.toString());
>       lr.resetConfiguration();
>     }
>     loggerRepositories.remove(cl.toString());
>   }
> 
>   private static void loadRepository(LoggerRepository loggerRepository) {
> 
>     URL url = getURL(resources);
> 
>     if (url != null) {
>       OptionConverter.selectAndConfigure(url, null, loggerRepository);
>     }
>   }
> .....
> }
> 
> 
> I set the Context Repository Selector when the server first starts up:
> 
>   if (guard == null) {
>     guard = new Object();
>   }
> 
>   ContextRepositorySelector crs = agent.registerContextRepositorySelector();
>   LogManager.setRepositorySelector(crs, guard);
> 
> 
> I have enabled debugging in Log4j.  When my server first starts up, I get
> the following debug statements due to the log4j.properties of the server,
> showing the root context and 2 appenders (Default and Console)
> 
> log4j: Parsing for [root] with value=[DEBUG, Default, Console].
> log4j: Level token is [DEBUG].
> log4j: Category root set to DEBUG
> log4j: Parsing appender named "Default".
> log4j: Parsing layout options for "Default".
> log4j: Setting property [conversionPattern] to [%d [%t] %-5p %c - %m%n].
> log4j: End of parsing for "Default".
> log4j: Setting property [append] to [true].
> log4j: Setting property [file] to [server/log/server.log].
> log4j: Setting property [datePattern] to ['.'yyyy-MM-dd].
> log4j: setFile called: server/log/server.log, true
> log4j: setFile ended
> log4j: Appender [Default] to be rolled at midnight.
> log4j: Parsed "Default" options.
> log4j: Parsing appender named "Console".
> log4j: Parsing layout options for "Console".
> log4j: Setting property [conversionPattern] to [%d [%t] %-5p %c - %m%n].
> log4j: End of parsing for "Console".
> log4j: Parsed "Console" options.
> log4j: Finished configuring.
> log4j: JIVS: Time taken to look up loggerRepository 368ms
> 
> I then deploy my service and call Logger.getLogger(my.service.class) to get
> the following for the root logger with 2 appenders(A1 and A2):
> 
> log4j: Parsing for [root] with value=[DEBUG, A1, A2].
> log4j: Level token is [DEBUG].
> log4j: Category root set to DEBUG
> log4j: Parsing appender named "A1".
> log4j: Parsing layout options for "A1".
> log4j: Setting property [conversionPattern] to [%d [%t] %-5p %c - %m%n].
> log4j: End of parsing for "A1".
> log4j: Setting property [file] to [server/log/recorder.log].
> log4j: Setting property [append] to [true].
> log4j: Setting property [datePattern] to ['.'yyyy-MM-dd].
> log4j: setFile called: server/log/recorder.log, true
> log4j: setFile ended
> log4j: Appender [A1] to be rolled at midnight.
> log4j: Parsed "A1" options.
> log4j: Parsing appender named "A2".
> log4j: Parsing layout options for "A2".
> log4j: Setting property [conversionPattern] to [%d [%t] %-5p %c - %m%n].
> log4j: End of parsing for "A2".
> log4j: Parsed "A2" options.
> log4j: Finished configuring.
> log4j: JIVS: Time taken to look up loggerRepository 33ms
> 
> Now the problem:
> 
> All my logs are directed to server.log and the console.  The recorder.log
> (log for the deployed service) is created, but no logs are appended to the
> file.  I know the log4j.properties config file of the service is found and
> loaded correctly due to the debug statements.
> 
> I really need some direction here and have come to a dead end.  Your
> feedback would be really appreciated.
> 
> Cheers,
> Vance
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to