[ 
https://issues.apache.org/jira/browse/LOG4J2-952?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14702530#comment-14702530
 ] 

Ralph Goers commented on LOG4J2-952:
------------------------------------

Although I would prefer it in the API I am not really sure that is possible. 
The Assembler interfaces could be in the API but the actual implementation 
(GenericConfigurationAssembler) would need to be in core. Furthermore, I am 
envisioning modifying ConfigurationFactory to look for Plugins. The XML and 
JSON configuration factories could be converted to Plugins and then a user 
could implement a custom configuration factory plugin that contains code 
similar to the above.

While we could accept the Level and Marker as objects, they would internally be 
converted to Strings as the assembler is creating the same Node hierarchy that 
the XML and JSON configurations create.  The actual objects get created when 
the configuration's start() method is called.

I took Bart's advice and added some get methods to the assemblers. The 
resulting code would now look like:
{code}
        GenericConfigurationAssembler assembler = new 
GenericConfigurationAssembler();
        assembler.setStatusLevel(Level.DEBUG);
        AppenderAssembler appenderAssembler = 
assembler.getAppenderAssembler("STDOUT", "CONSOLE");
        
appenderAssembler.addLayout(appenderAssembler.getLayoutAssembler("PatternLayout").
                addAttribute("pattern", "%d [%t] %-5level: 
%msg%n%throwable").assemble());
        
appenderAssembler.addFilter(appenderAssembler.getFilterAssembler("MarkerFilter",
 "DENY", "NEUTRAL").addAttribute("marker", "FLOW").assemble());
        assembler.addAppender(appenderAssembler.assemble());
        
assembler.addLogger(assembler.getLoggerAssembler("org.apache.logging.log4j", 
"DEBUG").addAppenderRef("CONSOLE").assemble());
        
assembler.addRootLogger(assembler.getRootLoggerAssembler("ERROR").addAppenderRef("Console").assemble());
        Configuration config = assembler.assemble();
{code}

> FAQ: How do I configure log4j2 programmatically in code without a 
> configuration file?
> -------------------------------------------------------------------------------------
>
>                 Key: LOG4J2-952
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-952
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: API, Configurators, Documentation
>    Affects Versions: 2.1
>            Reporter: Joe Merten
>
> I found [this 
> link|http://logging.apache.org/log4j/2.x/faq.html#config_from_code] which 
> said:
> {quote}
> You could use the static method #initialize(String contextName, ClassLoader 
> loader, String configLocation) in 
> org.apache.logging.log4j.core.config.Configurator. (You can pass null for the 
> class loader.) Be aware that this class is not part of the public API so your 
> code may break with any minor release.
> {quote}
> This documentation is unclear because it points to a member function which 
> needs a filename {{configLocation}} where as the topic is »without a 
> configuration file«.
> It shoud rather point to the member function 
> {{org.apache.logging.log4j.core.config.Configurator.initialize(ClassLoader 
> loader, ConfigurationSource source)}}.
> Example:
> {code:java}
> import org.apache.logging.log4j.core.config.ConfigurationSource;
> import org.apache.logging.log4j.core.config.Configurator;
> final String hardCodedXmlConfig =
>         "<?xml version='1.0' encoding='UTF-8'?>\n" +
>         "<Configuration status='INFO'>\n" +
>         "  <Appenders>\n" +
>         "    <Console name='Console' target='SYSTEM_OUT'>\n" +
>         "      <PatternLayout pattern='%d{HH:mm:ss.SSS} [%t] %-5level 
> %logger{36} - %msg%n'/>\n" +
>         "    </Console>\n" +
>         "  </Appenders>\n" +
>         "  <Loggers>\n" +
>         "    <Root level='debug'>\n" +
>         "      <AppenderRef ref='Console'/>\n" +
>         "    </Root>\n" +
>         "  </Loggers>\n" +
>         "</Configuration>\n";
> try {
>     Configurator.initialize(null, new ConfigurationSource(new 
> ByteArrayInputStream(hardCodedXmlConfig.getBytes())));
> } catch (IOException e) {
>     e.printStackTrace();
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to