Matthew Hill created LOG4J2-2061:
------------------------------------

             Summary: RollingFileManager not removed when RollingFileAppender 
is stopped, using DirectWriteRolloverStrategy
                 Key: LOG4J2-2061
                 URL: https://issues.apache.org/jira/browse/LOG4J2-2061
             Project: Log4j 2
          Issue Type: Bug
          Components: Core
    Affects Versions: 2.9.0
         Environment: *
            Reporter: Matthew Hill
            Priority: Blocker


When programmatically creating an instance of RollingFileAppender using 
RollingFileAppender.newBuilder.(config options).build(), an instance of 
RollingFileManager is created in AbstractManager.getManager(...), and this 
instance is stored in the hashmap AbstractManager.MAP as well as on the 
instance of RollingFileAppender in the super class 
AbstractOutputStreamAppender. This manager is created and stored in the 
AbstractManager.MAP with the name FILE_PATTERN (since we cannot create an 
instance of RollingFileAppender with a file name using the 
DirectWriteRolloverStrategy). However, the same manager is created with a NAME 
of NULL since it is trying to use file name as the name of the manager, but 
this parameter is not allowed using DirectWriteRolloverStrategy. 

The problem here is that the RollingFileManager is created with a name of FILE 
NAME (i.e., NULL when using DirectWriteRolloverStrategy) and added to the 
hashmap with a key of FILE PATTERN, but when the rolling file appender is 
stopped, it attempts to remove its manager from this MAP using 
RollingFileManager.name, which equates to FILE NAME which is NULL.

Consider the following example:
* create a rolling file appender using the DirectWriteRolloverStrategy with a 
file pattern of 'output.%i.log'
* a RollingFileManager is created with the name NULL, but put in 
AbstractManager.MAP with the name 'output.%i.log'
* the rolling file appender is used to write a few line of log file
* the rolling file appender is stopped using RollingFileAppender.stop(..)
* the RollingFileManager is NOT removed from AbstractManager.MAP since it is 
trying to remove FILE NAME but it is keyed on FILE PATTERN
* a NEW instance of rolling file appender is created using the 
DirectWriteRolloverStrategy with the SAME file pattern of 'output.%i.log'. 
* a new instance of RollingFileManager is NOT created, as it already exists in 
the MAP, so the old instance is simply returned
* the instance of RollingFileManager for the new instance of 
RollingFileAppender has a closed output stream, meaning that no logging is 
possible.

In the above example you can see that if the old rolling file appender's output 
stream is closed, and a new instance created with the same file pattern, then 
the old manager will be used. I see no easy way of recreating this output 
stream.

I found no documentation regarding why one cannot set the FILE NAME for a 
RollingFileAppender using DirectWriteRolloverStrategy. Being able to configure 
this may also solve the problem (unless it causes issues elsewhere), but 
another possible fix to this issue is to create the RollingFileManager with the 
name FILE PATTERN when using the DirectWriteRolloverStrategy. This way we add 
to the MAP the instance of RollingFileManager with the key FILE PATTERN, and we 
remove from the MAP RollingFileManager.name which equals FILE PATTERN



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to