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