This probably doesn't help much... 1. dump the threads in the logs (%t in <appender>.layout.CovertionPattern parameter) 2. verify the ClassLoader (getContextClassLoader) when writing the log. I *guess* this should be the same as when the service was created by your classloader.
After that try this in each "service" application :- 1. save the current context classloader 2. set the current context classloader (Thread.currentThread().setContextClassloader( this.getClass().getClassLoader() ); ) 3. perform your logging etc 4. restore the saved context classloader Carl > -----Original Message----- > From: Vance Karimi [mailto:[EMAIL PROTECTED] > Sent: Thursday 18 March 2004 16:28 > To: [EMAIL PROTECTED] > Subject: Contextual Repository Selector problem > > > 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] > > This message has been scanned for viruses by MailControl - www.mailcontrol.com --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
