David,
You are right to assume that there a different class loaders are different for jsps, servlets and EJBs in Weblogic. There is a different slightly different approach based on JNDI. Given that the JNDI name space is different for each application, one perhaps configure different resources for each of your application, that resource can then be used as the distinguishing factor for selecting logger repositories. I'll try this myself in a moment.
At 20:27 20.11.2002 -0500, Lu, David wrote:
Thanks for your reply, Jacob. I want to use log4j in a WebLogic environment with both EJBs and servlets. I also want to have this "separation" of logging so that if I have common components residing in many applications, those common components can be configured in one application without affecting the same common component in another application.I have used your Barracuda CRS and my approach is as follows: Put your CRS onto the system CP and have a Weblogic Startup class set that CRS as the logger repository to be used for the entire VM (WebLogic server). Put a ServletContextListener that will do a DOMConfigure() in each EAR and WAR file. I also happen to have a Servlet that will do a DOMConfigure() in its doPost() to dynamically reconfigure logging. This servlet is also in the EAR and WAR files. As my WebLogic server boots up, I can see that log4j is being initialized separately for each EAR and WAR file. That was encouraging since it led me to believe that the CRS was initializing a separate repository for each application (CL). However, after putting log4j statements in my EJBs, log4j complained that there were no appenders defined for loggers that were definitely defined in my log4j.xml. This suggested to me that even though there were separate repositories, the repository for my EJBs was not initialized with the loggers in my configuration file. As I thought about it more (with my poor knowledge of classloaders), this seems to make sense and would probably preclude using the CRS approach for EJBs (at least in WebLogic). My ServletContextListener lives in a Web Application classloader. Therefore, it's hierarchy is keyed in the CRS by its own CL. From my understanding, in WebLogic there is a separate CL for EJBs and servlets, with the former visible to the latter but not vice versa. Since there are two separate CLs, there will be separate hierarchies, one for EJBs and one for servlets. Since it was the servlet (listener) that initialized log4j, the key for that hierarchy will be the servlet classloader. The EJB, since it has its own CL, will have a separate repository that knows nothing about what the servlet did. In a past posting, Ceki said that using a servlet to initialize EJBs works. Nothing was said about using a custom repository selector. I assume that he made that statement assuming that I would keep one hierarchy for all applications instead of one hierarchy per application. Does this make sense to you? This would be a major blow to my strategy since my only other option is to place log4j.jar in each WAR/EAR file and *hope* administrators do not put a copy in the system CP. DAvid -----Original Message----- From: Jacob Kjome [mailto:[EMAIL PROTECTED]] Sent: Wednesday, November 20, 2002 5:12 PM To: Log4J Users List Subject: Re: WebLogic Repository Selector Question Hello David, Try the one I implemented. I works in Tomcat, but must exist in the the same classloader as the log4j.jar. In Tomcat, that means either in common/lib or shared/lib. Both can see each other so log4j.jar could be in common/lib and the jar containing Log4jCRS can be in either common/lib or shared/lib. Alternatviely, you can put a copy of log4j.jar in WEB-INF/lib. In that case, you need to make sure you also put the jar containing Log4jCRS in WEB-INF/lib as well. However, that doesn't really provide anything you don't already get by using log4j.jar in WEB-INF/lib anyway since that already provides a private environment for using Log4j for you app. Now, the other thing that needs to happen is that the classes using Log4jCRS *must* be loaded from the WebappClassloader. So, my Log4jInit servlet and Log4jApplicationWatch servlet context listener need to be inside a jar file in WEB-INF/lib. Here is Log4jCRS: http://barracuda.enhydra.org/software/cvs/cvsweb.cgi/Projects/EnhydraOrg/too lsTech/Barracuda/src/org/enhydra/barracuda/log4j/ Here are Log4jInit and Log4jApplicationWatch http://barracuda.enhydra.org/software/cvs/cvsweb.cgi/Projects/EnhydraOrg/too lsTech/Barracuda/src/org/enhydra/barracuda/webapp/log4j/ Also, you can see what the configuration for log4j looks like in the web.xml and log4j.xml here: http://barracuda.enhydra.org/software/cvs/cvsweb.cgi/Projects/EnhydraOrg/too lsTech/Barracuda/WEB-INF/ Now, keep in mind that the logger repositories created via Log4jCRS are keyed on the classloader. This means that when you do your configuration for each application, that application must be running in a separate classloader. I'm not sure exactly how that would work in an EJB container...but that is just because I haven't really written any EJB apps. Hopefully this helps with figuring out your issue. If nothing else, you can certainly use it for your webapps. Jake Wednesday, November 20, 2002, 3:21:02 PM, you wrote: LD> Has anyone tried the CRS in Ceki's containers document for WebLogic? LD> I've put that CRS class in a WebLogic startup class. LD> In my EJB.ejbCreate(), I have a statement like: LD> Logger logger = Logger.getLogger(StateEJB.class); LD> When ejbCreate() is called, I see the LD> public LoggerRepository getLoggerRepository() { LD> ClassLoader cl = Thread.currentThread().getContextClassLoader(); LD> Hierarchy hierarchy = (Hierarchy) ht.get(cl); LD> if(hierarchy == null) { LD> hierarchy = new Hierarchy(new RootCategory((Level) Level.DEBUG)); LD> ht.put(cl, hierarchy); LD> } LD> return hierarchy; LD> } LD> method getting called but I get a complaint from log4j saying there are no LD> appenders could be found for that logger and yet I see that logger in my LD> log4j.xml configuration file. LD> It's like that logger could not be found in my repository? LD> any ideas? LD> ********************************************************************** LD> This message, including any attachments, contains confidential information intended for a specific individual and purpose, and is protected by law. If you are not the intended recipient, please LD> contact sender immediately by reply e-mail and destroy all copies. You are hereby notified that any disclosure, copying, or distribution of this message, or the taking of any action based on it, LD> is strictly prohibited. LD> TIAA-CREF LD> ********************************************************************** LD> -- LD> To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> LD> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> -- Best regards, Jacob mailto:[EMAIL PROTECTED] -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
-- Ceki TCP implementations will follow a general principle of robustness: be conservative in what you do, be liberal in what you accept from others. -- Jon Postel, RFC 793 -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>