So, who gets to implement it. Ralph, is your time better spent on other log4j issues, or should I look for new opportunities to help here? Any suggestions?
On Sun, May 4, 2014 at 9:25 PM, Ralph Goers <ralph.go...@dslextreme.com>wrote: > It sounds like we are on a similar approach. > > Even with registering the Configuration with the StatusFileListener it is > possible that multiple configurations would want to write to the same file, > and so should share the same Listener. In that case closing the file would > only happen when the last Configuration is unregistered. > > Ralph > > On May 4, 2014, at 6:06 PM, Bruce Brouwer <bruce.brou...@gmail.com> wrote: > > I was thinking of something along these lines (since Matt was asking me > for my ideas): > > First off, make StatusConsoleListener a base class for > StatusSystemOutListener and StatusSystemErrListener (maybe inner classes). > These would no longer need to hold a reference to System.out or System.err, > so they will implictly follow any changes to System.out or System.err. > > Then make a new StatusFileListener for handling files and this class would > know to close output streams. This class could hold a static map of > listeners. We could either do reference counting here or my preference - > register the Configuration with StatusFileListener to get the listener. e.g. > > static StatusFileListener register(Configuration config, String fileName) > { ... } > static void StatusFileListener release(Configuration config) { ... } > > In the XMLConfiguration (and JSONConfiguration) stop and reconfigure > methods, it would deal with releasing the config. This is hidden behind > StatusConfiguration, so it might involve XMLConfiguration and > JSONConfiguration maintaining a reference to StatusConfiguration. I haven't > totally decided yet what would be best. > > (I was in the middle of typing this when I got Ralph's response) > > > On Sun, May 4, 2014 at 9:03 PM, Ralph Goers <ralph.go...@dslextreme.com>wrote: > >> I plan on removing the “extends Closeable” from the StatusListener >> interface and then creating a StatusCloseableListener that extends >> StatusConsoleListener. The close method will move there. Then in >> StatusConfiguration we will create the appropriate type based on what the >> destination is set to. I may choose to create a static map in >> StatusCloseableListener and keep a counter for each destination name or I >> may just use the property that says whether it is a web container and not >> close the files if it is. I am not sure yet which would be the best option. >> >> Ralph >> >> On May 4, 2014, at 4:30 PM, Matt Sicker <boa...@gmail.com> wrote: >> >> Could you summarize how you'd implement this? Idea sharing could help >> reduce the overall effort required to elegantly fix this. >> >> >> On 4 May 2014 16:00, Bruce Brouwer <bruce.brou...@gmail.com> wrote: >> >>> I was hoping to hear from Ralph as it sounds like he already started >>> something. >>> On May 4, 2014 3:22 PM, "Matt Sicker" <boa...@gmail.com> wrote: >>> >>>> If you've got a good idea on how to do it, sure. >>>> >>>> >>>> On 4 May 2014 14:04, Bruce Brouwer <bruce.brou...@gmail.com> wrote: >>>> >>>>> I haven't spent much time on this since my initial attempt on 609. >>>>> Shall I leave it to Ralph to come up with the final solution, or would you >>>>> like me to try? >>>>> On May 4, 2014 2:35 PM, "Matt Sicker" <boa...@gmail.com> wrote: >>>>> >>>>>> Looks like there's nothing to synchronise on actually. Guess you can >>>>>> just cache them before the check in general. >>>>>> >>>>>> >>>>>> On 4 May 2014 13:25, Matt Sicker <boa...@gmail.com> wrote: >>>>>> >>>>>>> Oh phew. Well, I'll leave that to you if you wanted to continue what >>>>>>> you were working on. All I added was a check on close() to compare >>>>>>> against >>>>>>> the current System.out and System.err. I'll take a look into OpenJDK to >>>>>>> see >>>>>>> how to properly lock those (if possible) to prevent fun race conditions. >>>>>>> >>>>>>> >>>>>>> On 4 May 2014 13:11, Ralph Goers <rgo...@apache.org> wrote: >>>>>>> >>>>>>>> No, it can be simpler than that. >>>>>>>> >>>>>>>> Sent from my iPad >>>>>>>> >>>>>>>> On May 4, 2014, at 10:55 AM, Matt Sicker <boa...@gmail.com> wrote: >>>>>>>> >>>>>>>> This is starting to sound like we need a full-blown >>>>>>>> factory/context/logger implementation of StatusLogger. >>>>>>>> >>>>>>>> >>>>>>>> On 4 May 2014 12:46, Ralph Goers <rgo...@apache.org> wrote: >>>>>>>> >>>>>>>>> Also, that doesn't solve the case Remko mentioned of multiple web >>>>>>>>> apps writing to a single file. >>>>>>>>> >>>>>>>>> Ralph >>>>>>>>> >>>>>>>>> On May 4, 2014, at 9:53 AM, Matt Sicker <boa...@gmail.com> wrote: >>>>>>>>> >>>>>>>>> So how about adding a check at construction checking against >>>>>>>>> System.out and System.err? Really, once you start messing with those >>>>>>>>> streams, you can't be sure they'll ever be closed until the JVM stops >>>>>>>>> or >>>>>>>>> you manually close it. >>>>>>>>> >>>>>>>>> >>>>>>>>> On 4 May 2014 09:36, Ralph Goers <rgo...@apache.org> wrote: >>>>>>>>> >>>>>>>>>> I see two choices here - maintain a use count or just let the OS >>>>>>>>>> close the files. >>>>>>>>>> >>>>>>>>>> The second would be pretty easy to do once we move the web stuff >>>>>>>>>> to its own module as it can add a property that the console Appender >>>>>>>>>> would >>>>>>>>>> look for. >>>>>>>>>> >>>>>>>>>> The first option is probably better if it could be made to work >>>>>>>>>> properly. >>>>>>>>>> >>>>>>>>>> Ralph >>>>>>>>>> >>>>>>>>>> On May 4, 2014, at 6:38 AM, Bruce Brouwer < >>>>>>>>>> bruce.brou...@gmail.com> wrote: >>>>>>>>>> >>>>>>>>>> This is what I was starting to investigate with LOG4J2-609. >>>>>>>>>> >>>>>>>>>> I don't think this is quite there yet. For one, in >>>>>>>>>> StatusConsoleListener.close(), System.out and System.err can change >>>>>>>>>> over >>>>>>>>>> time, so doing the != check might still close something that at one >>>>>>>>>> time >>>>>>>>>> was System.out but no longer is. >>>>>>>>>> >>>>>>>>>> Also, a StatusConsoleListener is shared among different >>>>>>>>>> JSONConfiguration and XMLConfiguration instances (think about >>>>>>>>>> multiple WARs >>>>>>>>>> in a Tomcat instance where log4j is in Tomcat's shared lib >>>>>>>>>> directory). If >>>>>>>>>> we undeployed one of those WARs, it would shutdown the >>>>>>>>>> StatusConsoleListener that was shared with the other WAR deployments. >>>>>>>>>> >>>>>>>>>> Also think about where some of these WARs wanted to use >>>>>>>>>> System.out and others want to use a log file for status logging. >>>>>>>>>> Because of >>>>>>>>>> the way these shared loggers are found, only the first >>>>>>>>>> StatusConsoleListener registered would actually take effect. So >>>>>>>>>> sometimes >>>>>>>>>> when you start Tomcat, status logs go to System.out, other times >>>>>>>>>> they go to >>>>>>>>>> a log file. I'd hate having to debug that one if I didn't know about >>>>>>>>>> this >>>>>>>>>> issue. >>>>>>>>>> >>>>>>>>>> I have an idea of how to address this, but it unfortunately isn't >>>>>>>>>> as simple as closing the StatusConsoleListener. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Sat, May 3, 2014 at 10:04 PM, Matt Sicker <boa...@gmail.com>wrote: >>>>>>>>>> >>>>>>>>>>> Hooray, we've finally figured out the bug. :) >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On 3 May 2014 19:49, Remko Popma <remko.po...@gmail.com> wrote: >>>>>>>>>>> >>>>>>>>>>>> I just updated from SVN and all tests now pass. >>>>>>>>>>>> The build works now. Thanks! >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> On Sun, May 4, 2014 at 7:55 AM, Matt Sicker >>>>>>>>>>>> <boa...@gmail.com>wrote: >>>>>>>>>>>> >>>>>>>>>>>>> I just fixed it in r1592291 haha >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> On 3 May 2014 17:54, Ralph Goers >>>>>>>>>>>>> <ralph.go...@dslextreme.com>wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Yes. It cause them to close. Anything written to System.out >>>>>>>>>>>>>> or System.err will fail. >>>>>>>>>>>>>> >>>>>>>>>>>>>> On May 3, 2014, at 3:51 PM, Matt Sicker <boa...@gmail.com> >>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> Does closing them do anything? >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 3 May 2014 17:10, Ralph Goers >>>>>>>>>>>>>> <ralph.go...@dslextreme.com>wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Perhaps we need a StatusFileListerner when writing to a file? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Ralph >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On May 3, 2014, at 3:03 PM, Ralph Goers < >>>>>>>>>>>>>>> ralph.go...@dslextreme.com> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> System.out or System.err should never be closed. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Ralph >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On May 3, 2014, at 10:59 AM, Matt Sicker <boa...@gmail.com> >>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I've implemented Closeable on StatusListener in r1592258. >>>>>>>>>>>>>>> Please try out the unit tests again and let me know if this >>>>>>>>>>>>>>> solves the >>>>>>>>>>>>>>> issue on Windows. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 3 May 2014 12:30, Matt Sicker <boa...@gmail.com> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I think this is actually a bug. StatusListener should >>>>>>>>>>>>>>>> implement Closeable, and when the listeners are cleared, it >>>>>>>>>>>>>>>> should loop >>>>>>>>>>>>>>>> through and close them before clearing the list of listeners. >>>>>>>>>>>>>>>> Otherwise, >>>>>>>>>>>>>>>> files can stay opened and Windows still hasn't figured out how >>>>>>>>>>>>>>>> to handle >>>>>>>>>>>>>>>> that. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 3 May 2014 11:22, Remko Popma <remko.po...@gmail.com>wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Thanks, commenting out that test to verify my changes was >>>>>>>>>>>>>>>>> exactly what I was doing now... :-) >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On Sun, May 4, 2014 at 1:20 AM, Ralph Goers < >>>>>>>>>>>>>>>>> ralph.go...@dslextreme.com> wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Oh, and if you are trying to do some work just comment >>>>>>>>>>>>>>>>>> out the @Test of the failing test - but don’t commit that. >>>>>>>>>>>>>>>>>> Ralph >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On May 3, 2014, at 9:19 AM, Ralph Goers < >>>>>>>>>>>>>>>>>> ralph.go...@dslextreme.com> wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> That happens because the file is still being referenced >>>>>>>>>>>>>>>>>> by something when it is trying to delete it. It should be >>>>>>>>>>>>>>>>>> because the file >>>>>>>>>>>>>>>>>> is open but I recall reading that Windows sometimes holds on >>>>>>>>>>>>>>>>>> to file >>>>>>>>>>>>>>>>>> references longer than it should. This was probably caused >>>>>>>>>>>>>>>>>> by the changes >>>>>>>>>>>>>>>>>> Matt made to the unit test framework a month or so ago. I >>>>>>>>>>>>>>>>>> will bring up my >>>>>>>>>>>>>>>>>> Windows VM and take a look at it this afternoon. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Ralph >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On May 3, 2014, at 8:58 AM, Remko Popma < >>>>>>>>>>>>>>>>>> remko.po...@gmail.com> wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Yes, windows 7. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On Sun, May 4, 2014 at 12:54 AM, Ralph Goers < >>>>>>>>>>>>>>>>>> ralph.go...@dslextreme.com> wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> FileOutputTest was failing for me last week and I >>>>>>>>>>>>>>>>>>> thought I fixed it. But it was failing because the file was >>>>>>>>>>>>>>>>>>> empty, not >>>>>>>>>>>>>>>>>>> because it couldn’t be deleted. I guess you must be running >>>>>>>>>>>>>>>>>>> on Windows? >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Ralph >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On May 3, 2014, at 8:44 AM, Remko Popma < >>>>>>>>>>>>>>>>>>> remko.po...@gmail.com> wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> > When I run mvn clean install, I get this problem: >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> > Failed tests: >>>>>>>>>>>>>>>>>>> > FileOutputTest.testConfig Could not delete >>>>>>>>>>>>>>>>>>> target\status.log, last modifed 14/05/04 0:27 >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> > FileOutputTest has a "CleanFiles" rule that seems to >>>>>>>>>>>>>>>>>>> fail: >>>>>>>>>>>>>>>>>>> > public RuleChain rules = RuleChain.outerRule(new >>>>>>>>>>>>>>>>>>> CleanFiles(STATUS_LOG)).around(new >>>>>>>>>>>>>>>>>>> InitialLoggerContext(CONFIG)); >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> > How do I fix this? >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> > Remko >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> --------------------------------------------------------------------- >>>>>>>>>>>>>>>>>>> To unsubscribe, e-mail: >>>>>>>>>>>>>>>>>>> log4j-dev-unsubscr...@logging.apache.org >>>>>>>>>>>>>>>>>>> For additional commands, e-mail: >>>>>>>>>>>>>>>>>>> log4j-dev-h...@logging.apache.org >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> >>>>>>>>>> Bruce Brouwer >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Matt Sicker <boa...@gmail.com> >>>>>> >>>>> >>>> >>>> >>>> -- >>>> Matt Sicker <boa...@gmail.com> >>>> >>> >> >> >> -- >> Matt Sicker <boa...@gmail.com> >> >> >> > > > -- > > Bruce Brouwer > > > -- Bruce Brouwer