Jody Garnett created LOG4J2-3469:
------------------------------------

             Summary: Override configuration file properties and appenders with 
programmatic configuration
                 Key: LOG4J2-3469
                 URL: https://issues.apache.org/jira/browse/LOG4J2-3469
             Project: Log4j 2
          Issue Type: New Feature
          Components: Configuration, Configurators, Core
    Affects Versions: 2.17.2
            Reporter: Jody Garnett
         Attachments: DEFAULT_LOGGING.xml

 

The documentation covers both [Initialize Log4j by Combining Configuration File 
with Programmatic 
Configuration|https://logging.apache.org/log4j/2.x/manual/customconfig.html#Hybrid]
 and [Programmatically Modifying the Current Configuration after 
Initialization|https://logging.apache.org/log4j/2.x/manual/customconfig.html#Programmatically_Modifying_the_Current_Configuration_after_Initialization].
 

However both these techniques are limited as to what they can accomplish:
 * MyXMLConfiguration.doConfigure() is shown adding an appender, via addLogger 
method
 * A custom configuration super.setup() method is shown using 
config.addLogger() and then ctx.updateLoggers().


My challenge is to programatically update the configuration to:
 *  Override logfile output location, either directly modifying appender, or 
modifying config property used by appender.
 * Optionally Filter out any RollingFileAppender or FileAppender appenders
 * Optionally suppress (filter out) any Console loggers if asked

I am seeking an api used to pre-process configuration if one is available.

Candidates:

*MyXMLConfiguration.setup()* prior to super.setup(): Unclear how easy/safe it 
is to to modify node structure directly? Is this what is intended?

{code:java}
public void setup() {
    for( Node child : rootNode.getChildren()){
        if ("Properties".equals(child.getName())){
            for( Node property : child.getChildren() ){
                if( property.getAttributes().containsKey("name") &&
                        
property.getAttributes().get("name").equals("GEOSERVER_LOG_LOCATION")) {
                    // override value with current GEOSERVER_LOG_LOCATION
                    property.setValue("foo.log");
                }
            }
        }
    }
    super.setup();
}{code}

*MyXMLConfiguration.doConfigure()* before super.doConfigure(): should be able 
to modify ``rootNode`` and make any changes required. Unclear how easy/safe it 
is to to modify node structure directly?

*MyXMLConfiguration.doConfigure()*  after super.doConfigure(): is too late:


 

- Can only append add loggers and appenders
- Modifications to config.getProperties() are not reflected in appender 
configuration.
- Modifications to existing appenders cannot be accomplished
- In the past when using a fluent / builder API there is an option to 
jump-start a builder with the configuration of an existing object. This 
approach would allow a builder to be loaded with an existing appender; revised, 
and a new appender generated as a replacement.

*MyXMLConfiguration.*{*}preConfigure(Node){*} allows xml to be rewritten 
just-in-time:
{code:java}
@Overrideprotected void preConfigure(Node node) {
    if( !node.isRoot() && node.getName().equals("Property")){
        if( node.getAttributes().containsKey("name") &&
                
node.getAttributes().get("name").equals("GEOSERVER_LOG_LOCATION")) {
            // override value with current GEOSERVER_LOG_LOCATION
            node.setValue("foo.log");
        }
    }
    super.preConfigure(node);
} {code}
For reference see attached {*}DEFAULT_LOGGING.xml{*}.



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to