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>