An instance of Log4jWebInitializer is stored in the servlet context, but that's a package-private interface since it's only used internally in org.apache.logging.log4j.core.web.
On 18 January 2014 17:50, Nick Williams <nicho...@nicholaswilliams.net>wrote: > I don't think that's necessary. The logger context definitely is already > added to the Servlet context attributes. It's adding it to each request's > attributes in the filter that's needed, if I remember the code correctly. > I'm not in a position to look at it right now. > > N > > > On Jan 18, 2014, at 3:43 PM, Matt Sicker wrote: > > I'm currently working on a patch that stores the logger context instance > in the servlet context attribute named > "org.apache.logging.log4j.spi.LoggerContext.ctx" (you can probably guess > how that comes into being). It's a bit of a modification from the attached > patch on LOG4J2-452 as I've also addressed some abuse of the > synchronization keyword issues as well. I should be done with this patch > within the next few hours. > > > On 18 January 2014 17:13, Nick Williams <nicho...@nicholaswilliams.net>wrote: > >> >> On Jan 18, 2014, at 2:42 PM, Matt Sicker wrote: >> >> I somewhat figured that anyone who would be using advanced async servlets >> probably isn't doing it in just a servlet container. I'd expect that sort >> of thing in an application container which does allow for some added >> abilities and such. Hence why OSGi came to mind. I know that WebSphere uses >> something vaguely similar to OSGi called "features", and like you said, >> JBoss/WildFly is using OSGi internally to some extent. Web Logic (at least >> the older 10.3 version we use at Peapod) just sort of barfs JARs and WARs >> all over the place and depends on archaic shell scripts to manage >> everything. >> >> Well anyway, in regard to some of your concerns about servlet 3.0, >> version 3.1 addressed some of these issues. For one, servlet and filter >> initialization was updated: >> >> >The service method is required to run in the same thread as all filters >> that apply to >> >the servlet. >> >> So that takes care of that! Developers who write multi-threaded servlets >> (which sounds awesome and terrible at the same time; thought this was the >> point of things like EJB and CDI) will have to fetch the logger context >> from, well, there's nowhere it's being stored that's easily obtained by the >> servlet writer. I'd put it in the request object as a wrapper in the filter. >> >> >> Good point. I can certainly make sure that the context is available as a >> request attribute. We can then publish that in the documentation for others >> to consume. >> >> Someone mentioned elsewhere about intercepting reads or writes on the >> servlet request or response objects in an async context, and v3.1 added >> javax.servlet.ReadListener and javax.servlet.WriteListener for just that >> situation. >> >> >> No, that does us no good. That lets us know that someone called a write() >> method on the output stream or a read() method on the input stream. So >> what? That doesn't empower us to do anything. The user doesn't need us to >> log those events. The user needs us to set up the logging context so that >> they can log things. What we would need is a way to detect that they were >> running a separate thread that was eventually going to call write() or >> read(), set the context in that thread, and then detect when they were done >> with the thread (probably returning it to a thread pool). Doing this would >> be vastly complicated (if even possible) on a container-by-container basis, >> impossible using the generic API. I contend that we simply can't do it. >> Users of Log4j who write asynchronous request handling will have to know to >> set the logging context (if necessary) in extrarequest threads. The best we >> can do is strongly document that requirement—which I will do. >> >> Nick >> >> >> >> On 18 January 2014 16:10, Nicholas Williams < >> nicho...@nicholaswilliams.net> wrote: >> >>> Unfortunately, Log4j simply has no way to guarantee intercepting when an >>> asynchronous request "wakes up." If the code dispatches the async context >>> to another Servlet or to a JSP, it'll trigger the Log4j filter again. If >>> the code just writes to the output stream, there's no way to know that >>> happened. >>> >>> A filter isn't the "perfect" solution, but it's really our only choice. >>> It takes care of _most_ situations—the vast majority of situations, I would >>> argue. Developers who use async contexts will have to go to extra effort to >>> make sure the logging context is set up. I don't see any way to avoid that. >>> Removing the filter would make life more difficult for those devs using >>> non-asynchronous requests. >>> >>> On the up side, not only does this issue only affect devs using async >>> requests, but also of THOSE situations it only really makes an impact with >>> non-standard configurations. Typical "out of the box" configurations don't >>> really NEED the logging context set up on each request. >>> >>> N >>> >>> Sent from my iPhone from LAX baggage claim, so please forgive brief >>> replies and frequent typos >>> >>> On Jan 18, 2014, at 13:56, Matt Sicker <boa...@gmail.com> wrote: >>> >>> Guys, I've been reading a little bit about OSGi lately, and that seems >>> like the perfect use case when combined with servlet 3.0. The thing is, >>> making minimal JARs is a lot like making bundles. >>> >>> The issue I see with async servlets, though, is how to manage the thread >>> local logger context when an async servlet can have multiple threads. The >>> most trivial way to make the proper logger context available _somewhere_ is >>> using request attributes or the servlet context attributes (which is >>> already being used to hold the initializer which holds the logger context >>> anyway). That's the thing, though. With multiple threads in a single web >>> app instance, it's hard to manage state for all those threads without being >>> higher up in the food chain. I don't think implementing this as a filter is >>> the best way to go for servlet 3.0. >>> >>> >>> On 18 January 2014 15:19, Ralph Goers <ralph.go...@dslextreme.com>wrote: >>> >>>> I was hoping to start the GA release sooner than that. >>>> >>>> If the servlet context initializer is disabled then the listener should >>>> still be allowed. >>>> >>>> Ralph >>>> >>>> On Jan 18, 2014, at 11:38 AM, Nicholas Williams < >>>> nicho...@nicholaswilliams.net> wrote: >>>> >>>> Yes. Next weekend I plan on adding a Servlet context parameter that >>>> allows the user to disable starting Log4j automatically. That should allow >>>> us to keep everything in one JAR while supporting both sides of the >>>> argument. >>>> >>>> Nick >>>> >>>> Sent from my iPhone, so please forgive brief replies and frequent typos >>>> >>>> On Jan 18, 2014, at 10:54, Gary Gregory <garydgreg...@gmail.com> wrote: >>>> >>>> On Sat, Jan 18, 2014 at 12:35 PM, Ralph Goers < >>>> ralph.go...@dslextreme.com> wrote: >>>> >>>>> I’ve always had reservations about the servlet 3.0 automatic >>>>> configuration because if the log4j jar is present it can’t be disabled or >>>>> be modified by the end user. We’ve had some issues with Spring >>>>> initialization and now LOG4J2-452 reinforces that. I would propose that >>>>> if >>>>> we want to keep it that we move the minimum amount required into its own >>>>> jar so that users have a choice as to whether it is automatically >>>>> initialized. >>>>> >>>>> Am I the only one who feels this way? Frankly, this and one other >>>>> issue I plan to work on this weekend are the only things I see as blockers >>>>> for a GA release. >>>>> >>>> >>>> For me, the fewer jars, the better. Can't this be configured somehow >>>> without having to do more jar juggling? >>>> >>>> Gary >>>> >>>> >>>>> >>>>> Ralph >>>>> >>>>> On Jan 17, 2014, at 8:25 PM, Nick Williams < >>>>> nicho...@nicholaswilliams.net> wrote: >>>>> >>>>> Filter initialization is one of the last things to happen in web app >>>>> startup. The ServletContainerInitializer sets the threads logger context >>>>> so >>>>> that web app startup procedures can use it. The filter's init() method >>>>> clears it near the end of startup so that it doesn't bleed into another >>>>> web >>>>> app. >>>>> >>>>> Then, on web apps shutdown, destruction of filters is one of the first >>>>> things to happen. The filter's destroy() sets the logger context so that >>>>> the web app shutdown procedures can use it. >>>>> >>>>> Nick >>>>> >>>>> On Jan 17, 2014, at 10:17 PM, Matt Sicker wrote: >>>>> >>>>> Now I'm not sure if I'm interpreting this correctly, but init() clears >>>>> the current thread's logger context, and destroy() sets it. What's up with >>>>> this? Especially since it just gets set and cleared in the doFilter() bit. >>>>> >>>>> -- >>>>> Matt Sicker <boa...@gmail.com> >>>>> >>>>> >>>>> >>>>> >>>> >>>> >>>> -- >>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>> Java Persistence with Hibernate, Second >>>> Edition<http://www.manning.com/bauer3/> >>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>>> Spring Batch in Action <http://www.manning.com/templier/> >>>> Blog: http://garygregory.wordpress.com >>>> Home: http://garygregory.com/ >>>> Tweet! http://twitter.com/GaryGregory >>>> >>>> >>>> >>> >>> >>> -- >>> Matt Sicker <boa...@gmail.com> >>> >>> >> >> >> -- >> Matt Sicker <boa...@gmail.com> >> >> >> > > > -- > Matt Sicker <boa...@gmail.com> > > > -- Matt Sicker <boa...@gmail.com>